以下代码将允许计数器函数每次计数器递增1();叫做。
function One() {
var counter = function(initial) {
var c = initial || 0;
return function() {
return c++;
};
}(0);
Too(counter);
}
function Too(counterArg) {
counter();
}
有什么东西我可以替换counter();这样柜台会减少吗?或者更好的是我有什么办法来设置计数器的价值?像counter = 0或counter = 20?另外,我需要远离全局变量。
答案 0 :(得分:2)
你可以在javascript中将函数指定为变量,所以现在你可以这样做......
var counter = 0;
var step = 1; // or 20 or whatever
var method = null;
function increment () {
counter += step;
}
function decrement () {
counter -= step;
}
method = icrement;
method();
答案 1 :(得分:1)
首先,您的代码中有一个小错字;大概是指你的意思
function Too(counterArg) {
counterArg(); // this was just `counter` originally; that will be undefined
}
其次,c++
是一个奇怪的方法来做一个计数器,因为它返回c
然后递增c
,所以计数器将从0开始,这可能是不是你想要的。
(我承认,只要我在代码中看到c ++,我就会轻笑一下。:P)
好的,关于主要问题:我是通过向计数器函数添加一个方法来实现的,例如set
。
function One() {
var counter = function createCounter(initial) {
var c = initial || 0;
function counter() {
return ++c;
}
counter.set = function(n) {
c = n;
};
return counter;
}(0);
Too(counter);
}
function Too(counterArg) {
counter(); // 1
counter.set(20); // `c` is now 20
counter(); // 21
counter(); // 22
}
这是有效的,因为counter
函数创建了所谓的闭包。这是JavaScript中一个相当普遍的概念,如果你不了解这个概念,你应该看一下关于SO的闭包的很多好问题和答案。基本上,即使您的匿名函数(我重命名为createCounter
)返回,变量c
仍然存在,可以从createCounter
中的任何代码访问。这就是counter
函数的工作原理。但c
以外的任何代码都无法访问createCounter
,因此如果您想对其执行任何操作,则必须将该代码放入createCounter
。这就是我添加的counter.set
方法。由于它在createCounter
范围内,因此可以自由修改c
。