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

Javascript 闭包期间变量存储在哪里?,javascript,closures,Javascript,Closures,好的,我知道在下面的代码中,当父函数计数器返回一个名为count的对象时,会创建一个闭包。但是有人能澄清一下我是否正确理解了控制流吗?在通过c.count()首次调用计数器函数的方法时,计数器函数被分配给变量c后,输出为1。每次调用时,存储的n都会递增,并返回新值。通过闭包的魔力,我明白这是可能的,所以通过调用这个函数四次,我每次都会得到一个以4结尾的新值,而不是简单地四次调用1。但是,n在等待我再次调用count方法以增加最近创建的值时,每次“挂起”时保存的值在哪里?n需要什么才能重新成为0?

好的,我知道在下面的代码中,当父函数计数器返回一个名为count的对象时,会创建一个闭包。但是有人能澄清一下我是否正确理解了控制流吗?在通过
c.count()
首次调用计数器函数的方法时,计数器函数被分配给变量
c
后,输出为1。每次调用时,存储的
n
都会递增,并返回新值。通过闭包的魔力,我明白这是可能的,所以通过调用这个函数四次,我每次都会得到一个以4结尾的新值,而不是简单地四次调用1。但是,
n
在等待我再次调用count方法以增加最近创建的值时,每次“挂起”时保存的值在哪里?
n
需要什么才能重新成为0?如果我声明一个新变量并将函数
计数器
分配给它?我试着去想这些,我突然想到了这些问题。我不确定我问的是令人讨厌的还是显而易见的——提前谢谢

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本身中可用的任何对象上,因此除非在返回的对象中为其添加另一个函数,否则无法重置闭包:

function counter() {
    var n = 0;
    return {
        count: function() { return ++n; },
        reset: function() { n = 0; }
    };
}
其中是n在等待我再次调用count方法以增加最近创建的值时每次“挂起”时保存的值

当然,变量
n
保存在内存中。它的行为与全局范围类似,但在
计数器
范围内

n需要什么才能重新成为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

非常感谢。但有一件事我仍然很好奇,那就是当我问到要声明一个新变量来存储
计数器的新副本时,要“重置”n,例如
var d=counter()console.log(d.count())
计数重新启动为1,无需使用特定的
重置方法将其重置。这是因为新的
计数器
与存储在
c
中的
计数器
完全分离吗?@phizzy Yes。这就是结束。两分钱看起来完全一样,但还是两分钱不同。