以下代码:
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
?
答案 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
循环。你的内部函数与此完全相同,只是没有外部声明的命名函数。