别再被setTimeout闭包坑了!90% 的人都写错过这个经典循环
你以为只是“延迟执行”其实变量早就被偷换了在 JavaScript 中setTimeout是最常用的异步工具之一。但当它和for循环、闭包一起出现时无数开发者都踩过同一个坑for(vari0;i3;i){setTimeout((){console.log(i);// 你期待输出 0,1,2实际却是 3,3,3},100);}为什么因为varsetTimeout 闭包 变量共享陷阱。今天我们就彻底拆解这个经典问题并告诉你如何用现代 JS 写出正确、安全、可维护的延迟逻辑。问题根源var的函数作用域 异步执行关键点有二1.var没有块级作用域for循环中的var i实际上是在整个函数或全局作用域中声明一次所有循环迭代共享同一个i。2.setTimeout是异步的当setTimeout的回调真正执行时for循环早已结束此时i的值已经是3循环终止条件。所以三个回调都引用了同一个已经变成 3 的变量i。常见错误解法别再用了解法一用setTimeout第三个参数传参可行但不推荐for(vari0;i3;i){setTimeout((x){console.log(x);},100,i);// 把 i 作为参数传入}虽然能工作但语义不直观回调函数签名被污染在复杂逻辑中难以维护。解法二立即执行函数IIFE——过时方案for(vari0;i3;i){(function(j){setTimeout((){console.log(j);},100);})(i);}这确实能创建新作用域但代码冗长阅读成本高ES6 之后已有更优雅方案。正确姿势用let声明循环变量这是最简单、最现代、最推荐的方式for(leti0;i3;i){setTimeout((){console.log(i);// 输出 0, 1, 2},100);}为什么let能解决let具有块级作用域每次循环迭代都会创建一个新的绑定binding每个setTimeout回调捕获的是当前迭代的独立 i互不干扰。这不是“魔法”而是 ES6 规范明确规定的语义。更复杂的场景循环中创建函数数组陷阱不止出现在setTimeout任何异步回调或延迟执行的函数都可能中招consthandlers[];for(vari0;i3;i){handlers.push(()console.log(i));}handlers.forEach(fnfn());// 输出 3,3,3修复方式同样简单consthandlers[];for(leti0;i3;i){handlers.push(()console.log(i));// 输出 0,1,2}或者用Array.map等函数式写法天然避免问题consthandlers[0,1,2].map(i()console.log(i));特别提醒Node.js 和浏览器都一样这个陷阱与运行环境无关无论是浏览器中的事件监听Node.js 中的定时任务React/Vue 中的副作用处理只要涉及var 异步 循环就可能出错。终极建议彻底告别var在现代 JavaScript 工程中默认使用const不可变绑定需要重赋值时用let永远不要用var除非维护老代码。配合 ESLint 规则{rules:{no-var:error}}从源头杜绝此类问题。结语setTimeout本身没有错错的是我们对作用域和闭包的理解偏差。而let的出现正是为了终结这类“反直觉”的陷阱。下次当你写循环异步时请记住不是代码跑错了是你还在用十年前的变量声明方式。升级你的语法远离闭包陷阱转发给那个还在用var写循环的同事吧各位互联网搭子要是这篇文章成功引起了你的注意别犹豫关注、点赞、评论、分享走一波让我们把这份默契延续下去一起在知识的海洋里乘风破浪

相关新闻

使用等效电路分析简化复杂电路的方法

使用等效电路分析简化复杂电路的方法

等效电路分析◆ 识别等电位点在复杂的电路中,我们常常需要找到等电位点,这些点可以视为同一个点,例如由短路线相连的点。现在,让我们来看一个具体的例子。图1展示了一个电路,其中所有电阻的阻值均为1欧。尽管这个电路初…

2026/7/7 10:47:25 阅读更多 →
流固耦合在Comsol5.6中解析

流固耦合在Comsol5.6中解析

comsol5.6 流体力学/流体传热/流固耦合。COMSOL 5.6玩转流体:从仿真到翻车现场最近在折腾COMSOL 5.6的流体模块,尤其是流固耦合(FSI)这块,发现有些坑不跳不知道,跳了直呼“真香”。今天随便唠唠几个典型场景…

2026/7/3 23:15:43 阅读更多 →
我常用的爬虫神器,低代码采集Tiktok商品海量数据

我常用的爬虫神器,低代码采集Tiktok商品海量数据

爬虫为什么难? 爬虫是网络数据采集的简称,顾名思义就是利用http请求技术向网站发送数据请求,然后进行html解析并提取到需要的数据,可以使用Python等工具实现,这个过程看似简单,但暗藏很多机关,…

2026/5/17 11:07:19 阅读更多 →

最新新闻

数据清洗不是预处理,而是Python数据工作的第一思维习惯

数据清洗不是预处理,而是Python数据工作的第一思维习惯

1. 为什么数据清洗不是“脏活”,而是你写代码时最该前置的思维习惯刚入行那会儿,我带过几个实习生,他们写完一个漂亮的机器学习模型,准确率92%,兴冲冲跑来给我看结果。我问:“训练数据里缺失值怎么处理的&a…

2026/7/7 20:57:20 阅读更多 →
Excel时间序列分析实战:从数据清洗到Holt预测

Excel时间序列分析实战:从数据清洗到Holt预测

1. 为什么用电子表格做时间序列分析?这不是“将就”,而是清醒的选择很多人一听到“时间序列分析”,脑子里立刻跳出Python、R、Jupyter Notebook这些词,仿佛不写几行代码、不调几个scikit-learn的函数,就不算真正入门。…

2026/7/7 20:57:20 阅读更多 →
Pyomo工业优化建模:可读性、可扩展性与可调试性的工程实践

Pyomo工业优化建模:可读性、可扩展性与可调试性的工程实践

1. 为什么我坚持用 Pyomo 做优化建模——一个十年工业算法工程师的坦白你有没有过这种经历:手头有个排产问题,Excel Solver 算到第三轮就卡死;写了个带非线性约束的参数调优脚本,scipy.optimize.minimize 跑出一堆 NaN&#xff0c…

2026/7/7 20:57:20 阅读更多 →
终极漫画电子化指南:5分钟掌握Kindle Comic Converter完整技巧

终极漫画电子化指南:5分钟掌握Kindle Comic Converter完整技巧

终极漫画电子化指南:5分钟掌握Kindle Comic Converter完整技巧 【免费下载链接】kcc KCC (a.k.a. Kindle Comic Converter) is a comic and manga converter for ebook readers. 项目地址: https://gitcode.com/gh_mirrors/kc/kcc 还在为电子阅读器上看漫画体…

2026/7/7 20:55:19 阅读更多 →
Java毕业设计用蛋糕商城系统:SpringBoot+MySQL完整可运行源码包

Java毕业设计用蛋糕商城系统:SpringBoot+MySQL完整可运行源码包

本文还有配套的精品资源,点击获取 简介:专为计算机专业学生准备的毕业设计级蛋糕在线选购系统,基于SpringBoot 2.x构建,后端用Java开发,数据库采用MySQL,配套完整建库脚本cake_mall.sql,导入…

2026/7/7 20:55:19 阅读更多 →
Adobe Illustrator自动化脚本技术架构深度解析:从核心原理到性能优化

Adobe Illustrator自动化脚本技术架构深度解析:从核心原理到性能优化

Adobe Illustrator自动化脚本技术架构深度解析:从核心原理到性能优化 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts Illustrator-scripts项目是一个基于ExtendScript技…

2026/7/7 20:53:18 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻