Javascript 制作镀铬延长件,可';t在js文件中正确分配全局变量(单个文件)

Javascript 制作镀铬延长件,可';t在js文件中正确分配全局变量(单个文件),javascript,ajax,google-chrome-extension,xmlhttprequest,Javascript,Ajax,Google Chrome Extension,Xmlhttprequest,奇怪的错误,说config是undefined,但这是错误的: 没有拼写错误: 我不是JavaScript程序员,这是我的第一个扩展。我希望这是一个众所周知的问题。唯一使用的是AJAX。代码是这样开始的: var config; var req = new XMLHttpRequest(); req.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) {

奇怪的错误,说
config
undefined
,但这是错误的:

没有拼写错误:

我不是JavaScript程序员,这是我的第一个扩展。我希望这是一个众所周知的问题。唯一使用的是AJAX。代码是这样开始的:

var config;
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    config = JSON.parse(this.response);
  }
}
req.open("GET", chrome.extension.getURL('/config.json'), true);
req.send();
// here console.log(config) will return undefined.

换句话说,变量的赋值很奇怪。

因为
XMLHTTPRequest
s是异步的(它们不会在代码流动时立即发生),所以您必须要么将代码放在加载事件侦听器中,要么从同一事件侦听器调用一个函数,该函数将包含该代码:

var config;
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    config = JSON.parse(this.response);

    // any code that uses config should be here
  }
}
或:


在后一种情况下,您不妨在另一时间将
config
作为参数传递给
doMagicStuff

,请提供完整的。您至少需要提供发生错误的行。您的代码中没有任何地方试图访问
currency
属性。因此,这是不完整的。通常,对于Chrome扩展调试问题,您几乎总是需要提供manifest.json。
var config;
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    config = JSON.parse(this.response);

    // call doMagicStuff here
    doMagicStuff();
  }
}

function doMagicStuff() {

    // code that use config goes here

}