var add = (function () {
var counter = 0;
return function () {
var reset = function() {
counter = 0;
}
return counter += 1;
}
})();
这是自调用函数创建一个“私人”的变量。 我将如何创建一个功能reset
,将计数器重置为0? 我试着声明瓶盖内的功能,但是当我打电话使用add.reset(),它告诉我这个方法是不确定的。
在理解任何帮助表示赞赏!
如果你想明确地保持封闭内声明的柜台,你需要声明复位(即使你不给它的值)关闭之外。 要使用你的代码,它是这样的:
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;
}
})();
可能会工作。 这将是从我所看到的,虽然稍不寻常的模式...
您应该返回复位功能由IIFE返回的对象的方法。 该对象必须是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
但是,它会更有意义(我)有一个计数器对象已添加和reset方法。
我建议,而不是试图把你的函数闭包中,你把你的变量闭包之外,就像这样:
var counter = 0;
var add = function() {
return counter += 1;
};
var reset = function() {
counter = 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());