V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Angela2022
V2EX  ›  程序员

闭包怪异问题: 为啥这个闭包函数不缓存 count 值?

  •  
  •   Angela2022 · 2022-11-12 21:13:22 +08:00 · 1396 次点击
    这是一个创建于 721 天前的主题,其中的信息可能已经有所发展或是发生改变。

    function createIncrement() { let count = 0; function increment() { count++; } let message = Count is ${count}; function log() { console.log(message); }

    return [increment, log]; } const [increment, log] = createIncrement(); increment(); increment(); increment(); log(); // What is logged?

    问题

    1. 为啥 log()输出 Count is 0? increment 闭包 ha 函数为啥不缓存 count 的值?

    2. 为啥把 let message = Count is ${count}移到 log 函数内就能输出 Count is 3? function log() { let message = Count is ${count}; console.log(message); }

    3 条回复    2022-11-13 23:28:53 +08:00
    dvsilch
        1
    dvsilch  
       2022-11-12 21:21:23 +08:00
    message 定义在闭包外
    sweetcola
        2
    sweetcola  
       2022-11-12 21:22:22 +08:00
    message 没有变啊,message 是字符串,不会随 count 改变而改变。
    wiluxy
        3
    wiluxy  
       2022-11-13 23:28:53 +08:00
    你把 count 返回,打印一下,count 是有变的,问题在于 message 的值在定义的时候就确定了是 ’Count is 0‘,把 message 改为函数调用就符合你的预期了
    ```js
    function createIncrement() {
    let count = 0;
    function increment() {
    count++;
    }

    let message = () => `Count is ${count}`;

    function log() {
    console.log(message());
    }

    return [increment, log];
    }

    const [increment, log] = createIncrement();
    increment();
    increment();
    increment();
    log(); // Count is 3
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   915 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:31 · PVG 05:31 · LAX 14:31 · JFK 17:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.