1

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

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

3 回答 3

5

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

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

小提琴

要查看它是如何工作的,您可以将上面的函数提取到一个命名函数中createFunction

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

像这样简单地使用它:

result[i] = createFunction(i);

小提琴

于 2013-09-29T08:26:56.430 回答
1

Your code:

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

When you call this function. You loop i from 0 to 9 and push those functions you created into the array. But, those functions are never run yet. When the loop ended when i = 10, you have an array of functions that you created but never called. So now.. when you call any one of the funcions by result[.. say 4]. The function will set var now = i, which is currently 10, and return that value. This is way you always get 10.

于 2013-09-29T08:36:07.413 回答
0

您正在使用关闭。你应该永远记住的一件事是闭包通过引用而不是值来存储外部变量。所以所有对的引用都i将更新为最终值为i10。

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

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

小提琴的链接

于 2013-09-29T08:28:59.087 回答