var add = (function () {
var counter = 0;
return function () {
var reset = function() {
counter = 0;
}
return counter += 1;
}
})();
这是一个自我调用的函数,可以创建一个私有的"变量。如何创建一个将计数器重置为0的函数reset
?我尝试在闭包内声明函数,但是当我使用add.reset()调用它时,它告诉我这个方法是未定义的。
理解任何帮助都表示赞赏!
答案 0 :(得分:4)
我建议不要试图将函数放在闭包中,而是将变量放在闭包之外,如下所示:
var counter = 0;
var add = function() {
return counter += 1;
};
var reset = function() {
counter = 0;
};
这样,变量具有适合您尝试使用它完成的范围。
答案 1 :(得分:4)
您应该将重置函数作为IIFE返回的对象的方法返回。该对象需要是 add 函数,因此将reset方法放在其上。就像在全局上下文中那样做,但在闭包内并返回 add 函数,例如:
var add = (function(){
var counter = 0;
function add(n) {
counter += n || 0;
return counter;
}
add.reset = function(){
counter = 0;
return counter;
}
return add;
}())
console.log(add(1)) // 1
console.log(add(4)) // 5
console.log(add.reset()); // 0
但是,对我来说,拥有计数器对象添加和重置方法会更有意义。
答案 2 :(得分:1)
如果要显式保持在闭包内声明的计数器,则需要在闭包之外声明重置(即使你没有给它一个值)。要使用您的代码,它将如下所示:
var reset;
var add = (function () {
var counter = 0;
return function () {
reset = function() {
counter = 0;
}
return counter += 1;
}
})();
现在重置超出了add函数的范围,因此它保留了在其中分配的值!
公平地说,没有理由在每次添加结果时分配重置...最好做一些事情:
var reset;
var add = (function () {
var counter = 0;
reset = function() {
counter = 0;
}
return function () {
return counter += 1;
}
})();
或者更好的是,如果您希望add.reset()
能够工作:
var counter = function () {
var counter = 0;
this.reset = function() {
counter = 0;
}
this.add = function () {
return counter += 1;
}
};
var add = new counter();
然后添加是一个完整的对象,或多或少听起来像你想要的那样。
或者如果你想坚持自我调用功能:
var add = (function () {
var counter = 0;
return function () {
this.reset = function() {
counter = 0;
}
return counter += 1;
}
})();
可能会工作。从我所看到的情况来看,这将是一个不同寻常的范例......
答案 3 :(得分:0)
如果您想保留当前计数的隐私,这是一个使用对象的答案:
function counter() {
var count = 0;
this.reset = function() {
count = 0;
return count;
};
this.add = function() {
return ++count;
};
}
然后例如:
var counter1 = new counter();
counter1.add();
console.log(counter1.add());
console.log(counter1.reset());