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

时间:2015-04-16 11:33:30

标签: javascript closures

好的,我知道在下面的代码中,当父函数计数器返回一个名为count的方法的对象时,会创建一个闭包。但有人可以澄清我是否正确理解控制流程?将计数器函数第一次调用到变量c后,通过c.count()调用,输出为1.并且每调用一次,存储的n就会增加并返回新值。我理解这可以通过关闭的魔力来实现,通过调用这四次,每次以4结尾而不是简单地获得1次四次,我得到一个新值。但n每次持有的价值在哪里"闲逛"而它等待我再次调用count方法来增加最近创建的值? 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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

  

每次n所持有的值"挂出"而它等待我再次调用count方法来增加最近创建的值?

变量n当然是在内存中保存的。它的行为与全局范围相似,但在counter范围内。

  

如果n再次使用干净的石板需要什么呢?

重置它。

我已经用自动执行功能样式重写了你的例子,以使其更清晰。希望它有所帮助。

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