作用于闭包:循环与闭包

// 预期结果:一直打印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)
}

猜你喜欢

转载自www.cnblogs.com/chorkiu/p/12132724.html
今日推荐