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