閉包背後的基本思想是,由於閉包程序通過值綁定所有本地數據,因此可以使用它們初始化並修改僅在生成函數的「實例」本地的變量。
由於這看起來像家庭作業,我將使用閉包回答一個不同的問題:使用閉包獲取完美的正方形(1,4,9等),一次一個。現在
function makeSquareIteratorFunction() {
var squareRoot = 1;
var getNext = function() {
// Calculate the number you need to return
var square = squareRoot * squareRoot;
// Apply side effects. In this case just incrementing the counter, but with
// Fibonacci you will need to be a little more creative :-)
// You might also prefer to do this first. Depends on your approach.
squareRoot = squareRoot + 1;
// Return the value
return square;
};
// Return the function object, which can then be called later
return getNext;
}
// Usage
var getNextSquare = makeSquareIteratorFunction();
alert(getNextSquare()); // 1
alert(getNextSquare()); // 4
alert(getNextSquare()); // 9
,值得指出的是,在外部函數(makeSquareIteratorFunction
)中定義的局部變量是局部的和必然要關閉。所以,如果你makeSquareIteratorFunction()
多次,後來者將是獨立於第一個:
var getNextSquare1 = makeSquareIteratorFunction();
alert(getNextSquare1()); // 1
alert(getNextSquare1()); // 4
var getNextSquare2 = makeSquareIteratorFunction();
alert(getNextSquare2()); // 1 (!) because it's a new closure, initialized the same way
alert(getNextSquare1()); // 9 (!) because it was "on" 4 last time
希望這有助於解釋這一點?如果沒有,留下評論。 :-)
我重新開始了作業,因爲這就是我聽起來的樣子。你有什麼嘗試?你能寫一個返回函數的函數嗎?你可以讓該函數返回一個存儲在閉包中的值嗎?如果你有這麼多,你如何更新你的價值? – btilly 2011-02-07 20:49:59
似乎對我來說很合理。 CS 101還是201? - 注意問題中的提示:「寫一個函數」,「存儲兩個...數字」,「定義並返回一個**嵌套**函數」... – 2011-02-07 20:50:45