JavaScript范围

时间:2016-10-07 13:34:40

标签: javascript

这可能是,也可能是一个常见的问题,但我找不到答案,至少不是这个具体的例子 - 这是我认为的常见问题。

在下面的代码中,为什么程序会发出3次警报?为什么,当使用let时,它是否像你期望的那样工作?

是否因为当使用let时,每次引用一个新变量或者不同的东西?如果这是一个糟糕的问题,请道歉 - 只是试图绕过它......

var arr = [1,2,3];
var o = [];

for(var i = 0; i < arr.length; i++) {
    var val = arr[i];
    o.push(function(){ alert(val); })
}

o.forEach(function(func){func()});

1 个答案:

答案 0 :(得分:0)

所有警报都链接到您覆盖的val变量。

如果您希望它保持唯一,那么您需要将其范围限定:

var arr = [1, 2, 3];
var o = [];

for (var i = 0; i < arr.length; i++) {
  //closed scope to keep VAL unique
  (function() {
    var val = arr[i];
    o.push(function() {
      alert(val);
    })
  })();
}

o.forEach(function(func) {
  func()
});