可变变量的JS闭包

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)

我在类似的问题上阅读了很好的答案,但这不符合我的情况.可以通过闭包访问可变变量.我怎样才能解决这个问题?

Tus*_*har 5

对象赋值不会复制对象,所有三个变量都会引用相同的对象.因此,即使更改循环内的值也会更新不同对象的相同位置.

在循环的最后一次迭代中,对象中的值设置为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)