好的,我知道在下面的代码中,当父函数计数器返回一个名为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
答案 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