我正在尝试创建一个由JavaScript中的函数组成的数组。我写了下面的代码来确保数组中的每个函数都返回它的位置,但是我为数组中的每个函数得到10,可以解释为什么?
function createFunctionArray(){
var result = new Array();
for(i=0;i<10;++i){
result[i] = function(){
var now = i;
return now;
};
}
return result
}
答案 0 :(得分: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);
答案 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;
}