Javascript 匿名回调函数中的全局未定义

Javascript 匿名回调函数中的全局未定义,javascript,Javascript,我有一些javascript函数。全局变量在f1中初始化,然后调用f2,在f2中它们显然是在后面调用后定义的。但是,它在f2中的匿名函数中未定义 var global = []; function f1() { global = [{id: 1}, {id: 2}, {id: 3}]; f2(); } function f2() { // HERE global = [{id: 1}, {id: 2}, {id: 3}] for(var i = 0; i

我有一些javascript函数。全局变量在f1中初始化,然后调用f2,在f2中它们显然是在后面调用后定义的。但是,它在f2中的匿名函数中未定义

var global = [];

function f1() {
    global = [{id: 1}, {id: 2}, {id: 3}];
    f2();
}

function f2() {

    // HERE global = [{id: 1}, {id: 2}, {id: 3}]

    for(var i = 0; i < global.length; i++) {

       f3(function(thisIsSomeJSONdata) {

        console.log(global[i].id); // cannot read id of undefined

        // HERE global[0], global[1], global[2] === undefined

        global[0].name = "A";
        global[1].name = "B";
        global[2].name = "C";
       });
    }
}

function f3(callback) {

    var thisIsSomeJSONdata;
    // timeout to simulate AJAX delay
    setTimeout(function(){
      callback(thisIsSomeJSONdata);
    },3000);
}
var-global=[];
函数f1(){
全局=[{id:1},{id:2},{id:3}];
f2();
}
函数f2(){
//这里的global=[{id:1},{id:2},{id:3}]
对于(变量i=0;i

即使匿名函数复制变量并在其中创建新的上下文,值也应与前面定义的相同。

异步调用则不同。for循环在调用
callback
之前执行,因此
i
在被调用后计算为
3
。 您必须为它提供一个闭包,如下所示:

var global = [];

function f1() {
    global = [{id: 1}, {id: 2}, {id: 3}];
    f2();
}

function f2() {

    // HERE global = [{id: 1}, {id: 2}, {id: 3}]

    for(var i = 0; i < global.length; i++) {

       (function(i) { 
         f3(function(thisIsSomeJSONdata) {
         console.debug(global);
         console.log(global[i].id); // cannot read id of undefined

         // HERE global[0], global[1], global[2] === undefined

         global[0].name = "A";
         global[1].name = "B";
         global[2].name = "C";
        });
       })(i);
    }
}

function f3(callback) {

    var thisIsSomeJSONdata;
    // timeout to simulate AJAX delay
    setTimeout(function(){
      callback(thisIsSomeJSONdata);
    },3000);
}
var-global=[];
函数f1(){
全局=[{id:1},{id:2},{id:3}];
f2();
}
函数f2(){
//这里的global=[{id:1},{id:2},{id:3}]
对于(变量i=0;i
在我这边看起来不错。试着在控制台中运行它。在f2中没有循环的情况下工作,但在f2中没有定义循环。仍然可以。如果执行顺序是给定的,并且没有在任何地方重新定义全局,那么应该总是可以的。尝试使用调试器单步执行以查看是否发生这种情况。您可以使用重新创建问题吗?控制台中记录的值看起来不错您的小提琴工作正常谢谢。这很有效。虽然即使我的计算结果是长度(即2),全局变量[2].id是3,但不确定为什么它是未定义的。长度是3。当长度为0时,数组为空。我建议你拿一本像样的书(也许是Crockford的?)如果你有JavaScript的长期计划,我保证-这将为你省去很多麻烦。是的,我有JavaScript-好的部分。我应该读完那本书。这是一本很棒的书,我已经习惯了处理很多问题的框架,所以我没有遇到过很多这样的框架。