作用于闭包:循环与闭包
// 预期结果:一直打印6 for(var i=1;i<=5;i++){ setTimeout(function(){ console.log(i); },i*1000) }
延迟函数的回调会在结束时才执行.事实上,当定时器运行时即使每个迭代中执行setTimeout(....,0),所有回调函数依然是循环结束后才会被执行.到底是什么"缺陷"导致它的行为同语义
for(var i=1;i<=5;i++){ (function(){ setTimeout(function timer(){ console.log(i); },i*1000) })() } //666666
形成闭包或者使用let就可以实现
for(var i=1;i<=5;i++){ (function(){ var j=i setTimeout(function(){ console.log(j); },j*1000) })() } //1 2 3 4 5 6 for(var i =1;i<=5;i++){ (function(j){ setTimeout(function(){ console.log(j); },j*1000) })(i) } // 使用let for(let i =1;i<=5;i++){ setTimeout(function timer(){ console.log(i); },i*1000) }