2013-10-18 29 views
0

下面的代碼將允許計數器功能在每次計數器()時遞增1。叫做。計數器功能的設定值

function One() { 
    var counter = function(initial) { 
     var c = initial || 0; 
     return function() { 
      return c++; 
     }; 
    }(0); 
    Too(counter); 
} 

function Too(counterArg) { 
    counter(); 
} 

有什麼我可以代替counter();這樣櫃檯會減少嗎?或者更好的是有什麼方法可以讓我設定櫃檯的價值?像計數器= 0或計數器= 20?另外我需要遠離全局變量。

回答

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

+0

這很好地工作。感謝您的幫助和關於關閉的提示。我將詳細閱讀。 – Kahless

+0

最初他們有點混淆,但一旦你掌握了它,它就是一個非常簡單而有用的概念。 SO上的這個答案相當了不起:http://stackoverflow.com/a/111111/470535 –

1

你可以現在你可以做到這一點分配功能的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(); 
+0

對不起,我忘了提及即時通訊試圖遠離全局變量。 – Kahless

+0

這只是一個使用函數作爲值的例子,我相信你知道如何在一個對象中封裝變量 –