闭包期间变量存储在哪里?

Where is the variable being stored during a closure?

好的,我知道在下面的代码中,当父函数计数器 returns 一个具有名为 count 的方法的对象时,会创建一个闭包。但是有人可以澄清我是否正确理解控制流吗?将计数器函数分配给变量 c 后,第一次调用该方法时,通过 c.count(),输出为 1。每次调用它时,存储的 n 都会递增并返回新值。我知道这可以通过闭包的魔力实现,因此通过调用四次我每次都得到一个以 4 结尾的新值,而不是简单地四次得到 1。但是,在等待我再次调用计数方法以增加最近创建的值时,n 每次 "hanging out" 保存的值在哪里? n 再次成为 0 需要什么?如果我声明一个新变量并将函数 counter 分配给它?试图把我的头围绕在这一切上,我想到了这些问题。我不确定我要问的是令人讨厌的还是痛苦的-提前谢谢你。

function counter() {
    var n = 0;
    return {
        count: function() { return ++n; },
    };
}
var c = counter();
console.log(c.count()); // 1
console.log(c.count()); // 2
console.log(c.count()); // 3
console.log(c.count()); // 4

闭包中的变量不存储在 JavaScript 本身可用的任何对象上,因此除非您在 return 对象中为其添加另一个函数,否则无法重置它:

function counter() {
    var n = 0;
    return {
        count: function() { return ++n; },
        reset: function() { n = 0; }
    };
}

where is the value that n holds each time "hanging out" while it waits for me to call the count method again to increment the most recently created value?

变量n当然是保存在内存中的。它的行为就像在全局范围内一样,但在 counter 范围内。

What will it take for n to have a clean slate again as 0?

重置它。

我已经用自执行函数样式重写了您的示例,以使其更清晰。希望对你有帮助。

var c = (function counter(){
    var n = 0;
    return {
        count: function() { return ++n; },
        //don't use keyword 'var', it will create a new variable instead of reseting n
        reset: function() { n = 0},
    };
})();
console.log(c.count()); // 1
console.log(c.count()); // 2
console.log(c.count()); // 3
console.log(c.count()); // 4
console.log(c.reset());
console.log(c.count()); // 1
console.log(c.count()); // 2
console.log(c.count()); // 3
console.log(c.count()); // 4