《JS函数的执行时机》

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

这段代码打印出的结果为6个6

  • 原因
    先执行for循环,当i=6时,跳出循环,循环结束后再执行console.log,
    setTimeout 尽快 就是忙完手头的事之后马上去执行下一件事
    在for循环里就是,先把循环执行完毕再执行console.log

注意

  1. setTimeout 中的回调是异步执行(计时器由浏览器新开一个线程执行,到点把回调放入宏任务队列;等待同步代码执行完毕 -> 清空当前循环微任务队列(这里微任务队列为空) -> 取出宏任务队列中下一个任务(即 setTimout 回调)执行;
  2. 执行 setTimeout 回调时如何查找 i 变量。

代码打印 0、1、2、3、4、5 的方法

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
  • 原因
    简单来讲就是把let写在for循环里面,这样可以单纯为每个i创造一个块级作用域,也就是复制6个i。
    这里的变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新变量。
    虽然每一轮循环时i都会重新声明,但是JS内部引擎会记住上一轮循环的值,然后复制了一个i的值,在初始化上一轮变量i的同时,保证了下一轮循环可以在上一轮循环的基础上进行计算,每次循环的i其实都是一个新的变量。

其他方法打印出 0、1、2、3、4、5

  • 使用立即执行函数
let i = 0
for(i = 0; i<6; i++){
!function(i){  
setTimeout(()=>{
  console.log(i)
},0)
}(i)
}

本文为张歆辉的原创文章,著作权归本人和饥人谷所有,转载务必注明来源

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

推荐阅读更多精彩内容

  • 函数执行时机不同,运行结果也不同 同步任务: 上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做...
    卢卢2020阅读 241评论 0 0
  • JS函数中,对函数调用的时机不同,得到的结果也会不一样,例如 下面这段代码 : 执行结果如下 : 结果显示打印出来...
    云卷云舒听雨声阅读 229评论 0 0
  • JS函数的执行时机 在解释JS函数的执行时机之前,先来看一个例子 将console.log打印出来是什么呢?答案是...
    茜Akane阅读 154评论 0 0
  • 什么是异步函数和同步函数 同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数所要做的事...
    sumuy阅读 322评论 0 0
  • 一、为什么如下代码会打印 6 个 6 ? let i = 0for(i = 0; i<6; i++){ setTi...
    大鱼JOHN阅读 214评论 0 0