Var vs let:这个JavaScript代码段是如何工作的?

Blu*_*ire 1 javascript scope

当我遇到这个时,我正在网上阅读一篇文章:

// Sample 2
var funcs = [];

for(let x=0; x<3; x++) { 
  funcs.push(() => x); 
}

funcs.forEach(f => console.log(f()));
// Output: 0, 1, 2
// when using var instead of let in the for-loop: 3, 3, 3
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这有效吗?我会想到同样会发生var......

我知道之间的区别varlet.我问的是为什么它不起作用var.

Phr*_*ogz 6

代码for (var x=...)声明了一个值,该值的值发生了变化,但是对于每个创建的函数都会关闭.所有函数都引用相同的值及其最新更改.使用略微较旧的代码有望使这更明显:

var callbacks = [];
for (var i=0;i<5;++i) callbacks.push( function(){ console.log(i) } );
callbacks.forEach(function(func){ func() })
// Outputs "5" five times
Run Code Online (Sandbox Code Playgroud)

for (let x=...)每次循环运行时,代码都会声明一个新变量,因此每个函数都会获得一个新变量(和相关值).这在创建回调时非常方便,因此您不必执行以下旧方法:

    var callbacks = [];
    for (let i=0;i<5;++i){
      // Create an anonymous function and invoke it, passing in 'i'.
      // Each time the function is run a *new* variable named 'n'
      // is created and closed over by the function returned inside.
      var cb = (function(n){ return function(){ console.log(n) }})(i);
      callbacks.push(cb);
    }
    callbacks.forEach(function(func){ func() })
    // Outputs "0","1","2","3","4"
Run Code Online (Sandbox Code Playgroud)

并且,为了证明,这里使用let:

    var callbacks = [];
    for (let i=0;i<5;++i) callbacks.push( function(){ console.log(i) } );
    callbacks.forEach(function(func){ func() })
    // Outputs "0","1","2","3","4"
Run Code Online (Sandbox Code Playgroud)

  • @MikeC参见[这个问题和答案](http://stackoverflow.com/questions/16473350/let-keyword-in-the-for-loop),包括[此错误报告](https://bugs.chromium.组织/ p/V8 /问题/细节?ID = 2560).简而言之:它就是这样的,因为人们做了额外的工作,使其在这种情况下更有用. (3认同)