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()。所以能按我们所想的进行输出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话