首先,你必須在你的代碼未成年錯字;想必你的意思是
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
。
這很好地工作。感謝您的幫助和關於關閉的提示。我將詳細閱讀。 – Kahless
最初他們有點混淆,但一旦你掌握了它,它就是一個非常簡單而有用的概念。 SO上的這個答案相當了不起:http://stackoverflow.com/a/111111/470535 –