之间的区别(num++
):
function numberGenerator() {
// Local “free” variable that ends up within the closure
var num = 1;
function checkNumber() {
console.log(num);
}
num++;
return checkNumber;
}
var number = numberGenerator();
number(); // 2
number(); // 2
number(); // 2
和
function numberGenerator() {
// Local “free” variable that ends up within the closure
var num = 1;
function checkNumber() {
console.log(num);
num++;
}
return checkNumber;
}
var number = numberGenerator();
number(); // 1
number(); // 2
number(); // 3
为什么第一个代码不记得num
的值?
为什么它是2而不是1?
答案 0 :(得分:3)
因为当您在第一个示例中运行number()
时,num++
不会再次执行,因为它不在该函数中。
答案 1 :(得分:1)
示例1使用var num = 1;
进行初始化,然后使用num++;
进行初始化。您调用第一个函数的频率并不重要,因为num
的值永远不会再次更改,它始终为2.只有console.log(num);
在您调用number()
时才会执行例1。
在示例2中,每次调用函数时都会执行num++;
。因此,每次通话都会增加。
答案 2 :(得分:1)
事实上,它确实记得很清楚。 num 的变量名值始终为2,无论你多久坚持调用它;即:执行变量名号的返回闭包。
它将永远保持2。
那是因为在第一个函数中你的闭包
没有保留 num 变量。
不会导致 num 增加。
每次调用都会返回主机函数(num ++)增加的结果,这只发生过一次。它的价值已经是2。
如果你再次调用 numberGenerator ,那就完全相同了,因为 num 值将被重新声明/重置为1而不是增加并且自我赋值为2下一个宣言。
所以,没有区别,只是你的第一个闭包,不能增加 num 变量值,因为它没有意思去做。
答案 3 :(得分:1)
在函数调用时(var number = numberGenerator),闭包' checkNumber()'可以访问本地变量' num',即使在用num ++递增后也保持该值。闭包可以直接访问本地变量'并在每次使用变量'来访问时更改它。这只适用于num ++在闭包内部,因为闭包可以直接访问它所包含的函数中的局部变量.Douglas Cockford的书" JavaScript:好的部分"在创建和理解闭包方面给了我很多帮助 我希望这有帮助!