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

2022-11-12 21:13:22 +08:00
 Angela2022

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); }

1286 次点击
所在节点    程序员
3 条回复
dvsilch
2022-11-12 21:21:23 +08:00
message 定义在闭包外
sweetcola
2022-11-12 21:22:22 +08:00
message 没有变啊,message 是字符串,不会随 count 改变而改变。
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
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/894749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX