Var vs let:这个JavaScript片段是如何工作的
Var vs let: how does this JavaScript snippet work?
我在网上读一篇文章时看到了这个:
// 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
谁能解释一下为什么这是有效的?我本以为同样的事情也会发生在var
…
我知道var
和let
的区别。我要问的是为什么它不与var
工作。
代码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
代码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"
并且,为了证明,这里使用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"
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- Jquery FadeIn FadeOut 只工作一次
- Foreach无法在Typescript中工作
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- JS可以在Chrome中工作,但不能在Firefox中工作
- ajaxToolkit PopupControlExtender不工作.过时的
- HTML标记在脚本标记中工作
- 在JavaScript中的类中,push和concat的工作方式有何不同