我知道一些闭包机制,但这段代码让我很困惑
我能理解为什么num value in message:1
是因为unmount
的过时关闭而打印的
但是为什么打印CCD_ 3而不是CCD_?num
在unmount
闭包中不是也过时了吗?
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();