JavaScript scoping

JavaScript scoping

本文关键字:scoping JavaScript      更新时间:2023-09-26

这可能是,也可能是一个常见的问题,但我找不到答案,至少在这个特定的例子中找不到——我相信这是一个常见的例子。

在下面的代码中,为什么程序发出3,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()});

所有的警报链接到您覆盖的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()
});