Javascript变量未更新/保存

3

我有一个字符串需要在多个函数中使用,因此我想将它保存在一个变量中。
但是当我尝试在函数内部赋值时,它不会更新该变量。

var auth_code = "na";
function safeAuthCode(authcode){
  auth_code = authcode;
  console.log(auth_code);
}

"auth_code"在控制台上能够正确打印,但是当我想要在后面使用它的时候,它只包含"na"。
不太确定我做错了什么:/

编辑:

这是调用safeAuthCode函数的函数:

function auth(){
  chrome.identity.launchWebAuthFlow({
    "url": "https://accounts.spotify.com/authorize?client_id="+client_id+
    "&redirect_uri="+ encodeURIComponent(redirectUri) +
    "&response_type=code"+
    "&scope=" + encodeURIComponent(scopes),
    "interactive": true
  },
  function(redirect_url) {
    var url = new URL(redirect_url);
    var code = url.searchParams.get("code");
    safeAuthCode(code);
  });
}

没有足够的代码可用于做出明智的猜测,如果您制作一个 [mcve],可能可以排除发生这种情况的原因。 - Icepickle
你是否可能在代码的多个部分创建了同一个变量?也许保存的值会在未来被覆盖。这种数据最好保存到sessionStorage中,这样更有意义。然后在读取/保存时可以使用getItemsetItem - Icepickle
不,它只会设置一次。该代码是 Chrome 扩展程序的一部分。我仍然能够使用会话存储吗?"window.sessionStorage.setItem('authcode', auth_code);" 和 "console.log(window.sessionStorage.getItem('authcode'));" 只返回 null :/ - thaiten
哦,从标签或问题中并不清楚你的代码是一个扩展程序。然而,有chrome.storage对象可用于保存数据。 - Icepickle
2个回答

0

我假设你遇到的问题是由于全局变量在代码的其他部分被覆盖,或者因为你的代码在某个时间点重新加载,导致初始值被重置。

为了保存这样的身份验证代码,你可以利用浏览器的sessionStorage对象。

为了确保你只有一个这样的对象,你可以使用const关键字来定义你的变量(如果以后另一个变量的定义会出现,你应该会收到一个错误提示)

const authorisationSettings = {
  get code() {
    return sessionStorage.getItem('authorisationCode') || 'na';
  },
  set code(value) {
    return sessionStorage.setItem('authorisationCode');
  }
};

function saveAuthorisationCode( code ) {
  authorisationSettings.code = code;
}

saveAuthorisationCode( 'test' );
console.log( authorisationSettings.code );

这段代码在stackoverflow上不起作用,你可以在jsfiddle这里找到它。


仍然只打印出“na” - thaiten
是的,这可能是因为您在Chrome扩展程序中使用它的原因。 - Icepickle
好的,我想我已经解决了问题,最终使用了这个:https://dev59.com/q2435IYBdhLWcg3wiggk#5370400 - thaiten

-2

这是因为当你的函数被执行时,该函数的词法环境中已经存在 authcode 变量,而你正在尝试设置它,而不是全局的 authcode

你需要更改全局变量的名称或函数的参数...


全局变量名为 auth_code,似乎在函数内被设置,并且与参数名称不同... - Icepickle
我不太清楚你的意思。我在另一个函数中调用了那个函数,并传递了变量authcode,但在那个函数中它被称为不同的名称。我也尝试过将其重命名。 - thaiten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接