JS 函数的执行时机

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

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

在for循环执行时i的值按照0,1,2,3,4,5值的变化,最后i的值是5,5小于6,i++,5变成6。i本该在条件表达式i<6的判断时被中断,但又因为setTimeout是异步的,for结束以后setTimeout把计算结束后的i=6打印出来了,setTimeout

运行6次所以打印了6次

 

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

1
2
3
4
5
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}  <br>//js在for和let一起用的时候会加东西<br>//每次循环会多创建一个i

  

(可选内容)除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5

因为setTimeOut()是异步执行,所以我们让它立即执行就可以了。

1
2
3
4
5
6
7
for (var i = 0; i < 6; i++) {
    !function(i){
      setTimeout(function() {
        console.log(i);
    }, 100 * i);
    }(i)
}

  这段函数会让JS检测到setTimeOut时不再放到队列中进行等待,而是立即运行setTimeOut()。所以能按我们所想的进行输出。

posted @   时间观测者  阅读(61)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示