JS 函数的执行时机

本文通过实例解析JavaScript中for循环与setTimeout的结合使用,导致打印6个6的现象,深入理解异步执行和作用域。并提供解决方案,使代码按预期打印0到5。此外,介绍了利用const关键字创建闭包来保持变量的独立性。
摘要由CSDN通过智能技术生成

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

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

上述代码之中出现6个6的原因在于setTimeout函数是一个异步的函数,上述代码的执行流程为:

  • i赋值为0 判断i < 6 ?,满足进入第一循环 setTimeout()会过一会执行–>跳过setTimeout()继续执行
  • 执行i++,此时i的值为1 判断i < 6 ?,满足进入第二循环
  • setTimeout()会过一会执行–>跳过setTimeout()继续执行 执行i++,此时i的值为2 省略…
  • 执行i++,此时i的值为6 判断i < 6 ?,不满足跳出循环 执行第一次循环的setTimeout() //打印出a
  • 执行第二次循环的setTimeout() //打印出a 执行第三次循环的setTimeout() //打印出a
  • 执行第四次循环的setTimeout() //打印出a 执行第五次循环的setTimeout() //打印出a
  • 执行第六次循环的setTimeout() //打印出a 结束

为什么?因为setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,意思就是不用再等多少秒了,只要主线程执行栈内的同步任务全部执行完成,栈为空就马上执行。也就是当同步任务的函数和语句执行完后,0秒或者立刻执行setTimeout(fn,0)。

2 写出让上面代码打印 0、1、2、3、4、5 的方法

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

3 其他方法

利用 const 关键字

let i
for(i = 0; i<6; i++){
    const x = i
    setTimeout(()=>{
      console.log(x)
    })
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值