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,根本没更新!

posted @ 2025-07-16 01:09  PEAR2020  阅读(7)  评论(0)    收藏  举报