JS 函数的执行时机

解释为什么如下代码会打印 6 个 6

先来看看以下代码,其执行结果是啥?

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

答案是 6 6 6 6 6 6

why?

这个例子似乎说明了以下的故事:小明正在打游戏, 妈妈喊他吃饭, 小明回答道: 马上就去吃饭,然后接着打完(一会)游戏。

这就是setTimeout函数的原理,这里的马上就去就相当于 setTimeout吃饭就相当于console.log, 但实际上还是先完成当前的事情,即for 循环

这就是所谓的执行时机. 换句话说, 函数什么时候开始调用,什么时候才开始查询参数的值。

如何正常打印理想结果

可以采用以下的方法来打印想要的结果

for(let i = 0; i < 6; ++i) {
   setTimeout(() => {
       console.log(i)
   }, 0)
}
// 0 1 2 3 4 5

是否还有其他方法打印?

有的,利用闭包的原理,将 i 的变量驻留在内存中,当输出a时,引用的是外部函数A的变量值 i,i 的值是根据循环来的,执行setTimeout时就可以确定里面的输出。

for(var i=0;i<6;i++){
  ! function(i){
      setTimeout(()=>{ console.log(i) },1000)
    }(i)    //在匿名函数后加 ( )立即执行,并把 i 当作参数 value传入匿名函数循环执行,参数 i 和匿名函数组成了闭包
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • JS函数中,对函数调用的时机不同,得到的结果也会不一样,例如 下面这段代码 : 执行结果如下 : 结果显示打印出来...
    云卷云舒听雨声阅读 271评论 0 0
  • 一、为什么如下代码会打印 6 个 6 ? let i = 0for(i = 0; i<6; i++){ setTi...
    大鱼JOHN阅读 228评论 0 0
  • 函数执行时机不同,运行结果也不同 同步任务: 上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做...
    卢卢2020阅读 396评论 0 0
  • 一、 解释为什么如下代码会打印 6 个 6 setTimeout函数会优先执行之前的事件,最后再执行后续的事件。而...
    快到碗里阅读 178评论 0 0
  • 为什么以下代码会打印出6个6,而不是012345呢? 原因: setTimeout是用于延迟执行代码的函数,它会把...
    Carlmac阅读 229评论 0 0

友情链接更多精彩内容