在javascript中访问回调函数的“外部”变量

时间:2017-03-08 08:54:33

标签: javascript callback xmlhttprequest

loadJSON(path, callback) {
    console.log("path: " + path); 
    var xobj = new XMLHttpRequest();
        xobj.overrideMimeType("application/json");
    xobj.open('GET', path, true);
    xobj.onreadystatechange = function () {
          if (xobj.readyState == 4 && xobj.status == "200") {
            callback(xobj.responseText);
          }
    };
    xobj.send(null);  
 }

上面是一个在本地访问json文件的函数。 然后从`foobar()'解析检索到的数据。 但是,从回调函数的“外部”,无法访问变量“json”。 我搜索过类似的SO问题和异步概念,但仍无法找到解决问题的方法。

function foobar() { 
    var json;
    loadJSON("data.json", function(response) {
        json = JSON.parse(response);
        console.log(json[0].name); // Successfully shows the result
    });
    console.log(json[0].name); // TypeError: json is undefined
}

有没有办法访问回调“外部”的变量?

2 个答案:

答案 0 :(得分:3)

这是因为它设置为异步模式。

console.log(json[0].name); // TypeError: json is undefined

此代码在json填充之前执行。因此,当您尝试访问它时,它可能仍然是空的。此行中的第三个参数将其定义为Async:

xobj.open('GET', path, true);

你可以试着把

xobj.open('GET', path, false);

但它不再异步,用户必须等待请求结束,所以最好确保使用' json'当回调方法已被调用而不是之前时,var。保持异步模式。 为此,您需要重新构建代码。

Gerardo Furtado发布的链接完全准确,您应该查看。

编辑:正如我已经说过的那样,和其他用户一样,async:false也不是很好,所以我编辑了我的答案:

function foobar() { 
    var json;
    loadJSON("data.json", function(response) {
        json = JSON.parse(response);
        // Call another function with json that is now filled with data
        triggered(json);
    });
}

function triggered(json) {
    console.log(json[0].name);
    // Do your work on json
}

答案 1 :(得分:0)

很简单。在函数外声明json变量。这为变量提供了全局范围。调用该函数只是为了覆盖json,json可以在脚本的任何地方使用