循环中的javascript闭包

时间:2014-08-17 19:08:54

标签: javascript for-loop closures

以下代码:

var a = [ ], i = 0, j = 0;

for (i = 0; i < 5; i += 1) { 

  (function(c) {
    a.push(function () { 

    console.log(c); });

  })(i);
};

for (j = 0; j < 5; j += 1) { a[j](); } 

为什么i总是变大1而不是留下5?是否已经传递了foor循环,因此赋予匿名函数的i参数应为5

2 个答案:

答案 0 :(得分:3)

如果您从内部闭包中引用i然后是,则在所有情况下您都会看到结果为5。但是,您将i 按值传递给外部函数,该函数被接受为参数c。然后,c的值固定为创建内部闭包时{em>

考虑更改日志语句:

i

你应该看到console.log("c:" + c + " i:" + i); 从0到4(含),c在所有情况下都是5。

答案 1 :(得分:2)

chhowie的答案是绝对正确的(我赞成它),但我想再向你展示一件事,以帮助理解它。你的内部函数与更明确的函数调用类似:

var a = [ ], i = 0, j = 0;

function pushFunc(array, c) {
    array.push(function () { 
        console.log(c); 
    });
}

for (i = 0; i < 5; i += 1) { 
    pushFunc(array, i);
}

for (j = 0; j < 5; j += 1) { a[j](); } 

这也应该有助于您了解c如何来自函数参数,而不是来自for循环。你的内部函数与此完全相同,只是没有外部声明的命名函数。