首先,您的代码中有一个小错字;大概你的意思是
function Too(counterArg) {
counterArg(); // this was just `counter` originally; that will be undefined
}
其次,c++
做一个计数器有点奇怪,因为它返回c
然后递增c
,所以计数器将从 0 开始,这可能不是你想要的。(我承认,每当我在代码中看到 c++ 时,我都会咯咯地笑。:P)
好的,关于主要问题:我会通过向名为 eg 的计数器函数添加一个方法来做到这一点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
不能被. 这就是我添加的方法的作用。既然是 inside ,就可以自由修改。createCounter
createCounter
counter.set
createCounter
c