为什么要在javascript闭包中打印此值



我知道一些闭包机制,但这段代码让我很困惑

我能理解为什么num value in message:1是因为unmount的过时关闭而打印的

但是为什么打印CCD_ 3而不是CCD_?numunmount闭包中不是也过时了吗?

const test = () => {
let num = 0;
const effect = () => {
num += 1;
const message = `num value in message:${num}`;
return function unmount() {
console.log(message);
console.log("num value:", num);
};
};
return effect;
};
const add = test();
const unmount = add();
add();
add();
add();
add();
unmount(); // num value in message:1 ; num value: 5

代码沙箱

num在卸载闭包中不是也过时了吗?

不,因为只创建了一个num,就在这里:

let num = 0;

当测试运行时,并且测试只运行一次。

num的任何引用都将引用该变量。当效果运行时,num += 1;将递增一个变量。

但是,如果你在内部效果中创建了一个新的变量,而不是增加外部效果,那么它就会过时。

const test = () => {
let num = 0;
const effect = () => {
const innerNum = num + 1;
const message = `num value in message:${innerNum}`;
return function unmount() {
console.log(message);
console.log("num value:", innerNum);
};
};
return effect;
};
const add = test();
const unmount = add();
add();
add();
add();
add();
unmount(); // num value in message:1 ; num value: 5

消息是";陈腐的";因为创建和使用的字符串是在CCD_ 10完成所有add调用的递增之前创建的。如果从上次添加中卸载,它就不会过时。

const test = () => {
let num = 0;
const effect = () => {
num += 1;
const message = `num value in message:${num}`;
return function unmount() {
console.log(message);
console.log("num value:", num);
};
};
return effect;
};
const add = test();
add();
add();
add();
add();
const unmount = add();
unmount();

最新更新