Javascript关闭/范围

时间:2018-03-30 21:49:59

标签: javascript scope closures

我正在学习关闭和范围,并且遇到了这个例子。我很困惑为什么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 

2 个答案:

答案 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(),你会减少吉姆的钱。