debug- 居然没注意到闭包问题
💥 我居然在真实代码里遇到了闭包问题,笑死!
今天调试项目的时候遇到一个让人“破防”的 bug:我写了一个 console.log,怎么也打印不出来,百思不得其解,直到我意识到:
是 闭包!!!闭包!!!闭包!!!
🧩 问题背景
我在用 Redux 管理购物车状态,并封装了一个 useSmartCart hook,目的是:
-
让每次调用购物车操作(如加商品、减商品)之后自动上传同步;
-
所以写了一个
maybeUpload()函数,放在每个 action 执行完之后触发。
👇 代码结构如下:
const maybeUpload = () => { if (user?.id && tenantId && tenantName) { console.log('😭===准备debounceUploadCart: cartState.items ' + JSON.stringify(cartState.items)); debounceUploadCart(user.id, tenantId, tenantName, cartState.items); } }; const wrapped = <T extends keyof typeof cartActions>(key: T) => { return (...args: any[]) => { cartActions[key](...args); maybeUpload(); }; };
问题:
cartState.items 数量不对
console.log 根本不打印
🧠 最终结论:闭包
这个 maybeUpload() 是在 useSmartCart() 初始化时创建的,
当时的 cartState.items 还没变化。
后面你 dispatch(action) 确实把 Redux 的 cart 状态变了,
但闭包捕获的是旧的 cartState.items,根本没更新!

浙公网安备 33010602011771号