-
我在循环里用 var 注册了几个回调,本想让它们各自打印 0、1、2,结果它们齐刷刷全打印了 3,我盯着这个诡异的结果排查了大半天的深度复盘
我在 for 循环里用 var 注册了几个 setTimeout 回调,本想让它们各自打印 0、1、2,结果它们齐刷刷全打印了 3。这几个回调明明在 i 不同时刻创建,怎么全记住了循环结束后的 3?深究才懂是两个机制叠加:一,var 是函数作用域不是块作用域,整个循环只有一个共享的 i;二,闭包捕获的是变量(引用)而非那一刻的值。加上回调是异步延迟执行的——执行时循环早跑完、共享的 i 已是 3,…- 0
- 0
-
给五个按钮绑点击事件,点哪个都弹出"第 5 个":我在 JavaScript 里被一个 for 循环里的 var 闭包坑到怀疑人生,以及作用域与闭包的全面复盘
动态生成五个按钮,点第几个就弹"第几个"——结果点哪个都弹"第 5 个"。绑定时打印 i 明明是 0~4,执行时却全变 5。根因是 var 函数作用域:整个循环只有一个 i,而五个闭包捕获的是这个变量的引用而非值。这篇复盘讲清原理、let 一字之差的正解、IIFE 等老办法,并延伸到 setTimeout 异步亲戚坑,以及闭包既是坑也是 JavaScript…- 0
- 0
var与let
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!


