【发布时间】:2015-02-06 05:19:50
【问题描述】:
考虑以下代码:
var a = [ { a: 'I' }, { a: 'II' }, { a: 'III' } ];
for( var i=0; i<a.length; i++ ){
var j = i;
var x = a[ i ];
x.bb = function(){
x.b = "-" + x.a + "-";
}
x.cc = function(){
a[ i ].c = "-" + a[ i ].a + "-";
}
x.dd = function(){
a[ j ].d = "-" + a[ j ].a + "-";
}
}
for( var i=0; i<a.length; i++ ){
a[i].bb();
a[i].cc();
a[i].dd();
}
console.log( a );
将导致(遗漏的功能):
[ { a: 'I', c: '-I-' },
{ a: 'II', c: '-II-' },
{ a: 'III', b: '-III-', d: '-III-', c: '-III-' } ]
所以只有 cc() 做我打算做的事情。
我现在的问题是:
- 这里的变量如何存储在闭包中的规则是什么。 (显然
i被存储为常量,而j和x被存储为对局部变量的引用,这些变量在 for 循环迭代时会发生变化。但这是为什么呢?) 这是我的错误。该代码之所以起作用,是因为第二个和第一个i相同! - 有没有办法编写
bb()以存储对a[ i ]的引用,这样我就不必使用索引了?
谢谢!
【问题讨论】:
-
这里没有闭包。
-
抱歉措辞错误。那么,您将如何命名这些存储对周围范围的引用的函数?
-
闭包通过保持对外部变量环境的引用来工作。在这种情况下,您的所有函数都具有相同的外部变量环境(即全局范围)。因此,当您在函数内部引用
i和j时,您指的是存在于函数外部的全局i和j。如果您想捕获一个值,而不是对(可能变化的)变量的引用,请参阅JavaScript closure inside loops – simple practical example
标签: javascript node.js closures