简单的Javascript关闭问题

时间:2016-01-17 00:10:57

标签: javascript closures

我知道为什么这不起作用,但无法找到正确的方法。

我尝试使用循环构建对象。 对象构建正常,但是当我尝试使用回调时,它会警告" 2"对于每个人,我都希望提醒阵列中的位置。

var playerArr = ["steve", "paul", "bob"];

var myAutomatedObj = {};
for (var i=0; i<playerArr.length; i++){
    var objName = playerArr[i];
    myAutomatedObj[objName] = {};
    myAutomatedObj[objName]["callback"] = function(){
        alert(i);
    }
}

//returns incorrect alert
myAutomatedObj.steve.callback();

1 个答案:

答案 0 :(得分:1)

属性i由每个函数引用,因为它在它们的作用域中,但它的值等于循环结束时数组的长度。

尝试以下方法:

myAutomatedObj[objName]["callback"] = (function(j) {
    return function(){
        alert(j);
    }
})(i);

这样您实际上复制了该值,并且您不再引用名为i的变量。