javascript中的意外引用错误

时间:2013-09-29 08:23:37

标签: javascript

我正在尝试创建一个由JavaScript中的函数组成的数组。我写了下面的代码来确保数组中的每个函数都返回它的位置,但是我为数组中的每个函数得到10,可以解释为什么?

function createFunctionArray(){
    var result = new Array();
    for(i=0;i<10;++i){
        result[i] = function(){
            var now = i;
            return now;
        };
    }
    return result
}

3 个答案:

答案 0 :(得分:5)

函数执行被延迟,它返回对i的引用,而不是它的实际值。您需要将i放在闭包中,以创建其值的本地副本。像这样:

result[i] = (function(i) { 
    return function(){
        var now = i;
        return now;
    } 
})(i);

Fiddle

要了解其工作原理,您可以将上述功能提取到命名函数createFunction

var createFunction = function(i) {
    return function(){
        var now = i;
        return now;
    } 
}

使用它就像这样:

result[i] = createFunction(i);

Fiddle

答案 1 :(得分:1)

您的代码:

function createFunctionArray(){
    var result = new Array();
    for(i=0;i<10;++i){
        result[i] = function(){
            var now = i;
            return now;
        };
    }
    return result
}

调用此功能时。您将i从0循环到9并将您创建的函数推送到数组中。但是,这些功能从未运行过。 当循环在i = 10时结束时,你有一个你创建但从未调用过的函数数组。所以现在..当你通过结果[...说4]调用任何一个函数时。该函数将设置var now = i,当前为10,并返回该值。 这样你总能得到10。

答案 2 :(得分:0)

你正在利用封闭。有一件事你应该永远记住,闭包存储外部变量的引用而不是值。因此,对i的所有引用都将更新为i的最终值10。

正确执行此操作的一种可能方法是

function createFunctionArray(){
var result = new Array();
for(i=0;i<10;++i){
    (function(j){
        result[j] = function(){
        return j;
        };
    })(i);    
}
return result;
}

link for fiddle