我正在学习关闭和范围,并且遇到了这个例子。我很困惑为什么humansMoney
每次调用函数时都会继续递减,但在我看来,它应该在每次调用时重置为100。
教师一度提到通过调用carl()
,我们只调用内部函数,而不是外部函数。我根本就不明白这一点.... carl()
正在调用human()
,那么为什么humansMoney
不能重置为100?
有人可以解释(比如我5)这种现象发生的原因吗?我非常感谢你对此有任何建议。
非常感谢你。
function human() {
var humansMoney = 100;
function cat() {
humansMoney--;
console.log('human: ' + humansMoney);
var catsMoney = 100;
console.log('cat: ' + catsMoney);
}
return cat;
}
var carl = human();
carl(); // humansMoney = 99, catsMoney = 100
carl(); // humansMoney = 98, catsMoney = 100
carl(); // humansMoney = 97, catsMoney = 100
carl(); // humansMoney = 96, catsMoney = 100
答案 0 :(得分:1)
var humansMoney = 100;
仅在您调用human
函数时运行。
你只做一次。
每隔一次,您调用carl
函数,这是返回的cat
函数。
重新编辑。
carl()正在调用human()
不,不是。
调用carl
的值,即表达式human()
的返回值。这就是猫的功能。
答案 1 :(得分:0)
调用函数human
的返回值本质上是内部函数cat
的定义,其中一个闭包包含对变量humansMoney
的引用。这就是为什么你可以像carl
那样调用carl()
。每次调用carl()
时,您实际上都在调用cat
,但存储和持久存储的humansMoney
值将从一次调用存储到下一次调用。
如果您再次调用human
,将其分配给新变量,例如var jim = human()
,则会有一个新的闭包,其中humansMoney
为100.现在每次你打电话给jim()
,你会减少吉姆的钱。