ale*_*x23 2 javascript closures mutable
请帮助我找出循环期间本地"j"变量继续变化的原因:
var a1 = a2 = a3 = {};
for (var i = 1; i < 4; i ++ ) {
(function(j){
console.log(j);
window['a'+j].fu = function(){
console.log('fu:',j);
};
})(i);
}
a1.fu(); // returns "fu:,3" - why not 1?
a2.fu(); // returns "fu:,3" - why not 2?
a3.fu(); // returns "fu:,3"
Run Code Online (Sandbox Code Playgroud)
我在类似的问题上阅读了很好的答案,但这不符合我的情况.可以通过闭包访问可变变量.我怎样才能解决这个问题?
对象赋值不会复制对象,所有三个变量都会引用相同的对象.因此,即使更改循环内的值也会更新不同对象的相同位置.
在循环的最后一次迭代中,对象中的值设置为3,并且在for循环后检索值时,将为所有变量返回值3.
创建对象时
var a1 = a2 = a3 = {};
Run Code Online (Sandbox Code Playgroud)
所有三个变量都指向同一个对象.
问题的解决方案可以单独声明对象.
var a1 = {},
a2 = {},
a3 = {};
for (var i = 1; i < 4; i++) {
(function(j) {
console.log(j);
window['a' + j].fu = function() {
console.log('fu:', j);
};
})(i);
}
a1.fu(); // returns "fu:,3" - why not 1?
a2.fu(); // returns "fu:,3" - why not 2?
a3.fu(); // returns "fu:,3"
Run Code Online (Sandbox Code Playgroud)