我知道一些关闭机制,但这段代码让我很困惑。
我能理解为什么num value in message:1会因为unmount陈旧的关闭而被打印出来。
但是为什么num value: 5被打印而不是num value: 1呢?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发布于 2021-01-07 23:45:56
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
消息是“陈旧的”,因为创建和使用的字符串是在num被所有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();
https://stackoverflow.com/questions/65621476
复制相似问题