JS函数执行时机

请问下面这段代码会打印什么结果

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

打印出6 个6
解析:
因为i作用域,不属于 for 循环体,属于 global;等到for循环体结束,i已经等于6了,这个时候再执行setTimeout的6个回调函数,里面的i去向上找作用域,只能找到global下的 i,就是6

解决办法,人为给console.log(i)创造作用域,保存i的值

解决方案一

let

for(let i =0; i < 6; i++) {
setTimeout(()=> {
  console.log(i)
},0)
}

let作为代码块的作用域,每次for循环拿的都是for代码块作用域下的i;就能得到 0,1,2,3,4,5,

setTimeout 延时 delay 毫秒之后,啥也不管,直接将回调函数加入事件队列。

解决方案二

立即执行函数

let i = 0
for (i = 0; i < 6; i++) {
  (function(i) {
    setTimeout(() => {
      console.log(i)
    }, 0)
  })(i)
}

这样console.log(i) 中的i就保存在每一次循环生成的立刻执行函数中的作用域里了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。