閉鎖の背後にある基本的な考え方は、クローザーが値によって、すべてのローカルデータをバインドするので、あなたは初期化して生成された関数の「インスタンス」にのみローカルな変数を変更するためにそれらを使用することができ、ということです。
これは宿題のように思えるので、私は、クロージャを使用して別の質問に答えるつもりです:完璧な正方形(1、4、9、など)を1つずつ取得するためにクロージャを使用してください。
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
合理的に私には明らかです。 CS 101または201?私はそれが何だあれば、クロージャが、ここではどのように動作するかを説明 –
...「関数を書く」、「店舗2つの...番号」、「定義し、ネストされた** **関数を返す」: - 問題のヒントに注意してください。あなたを混乱させる:http://sleeplessgeek.blogspot.com/2009/12/so-what-are-these-closure-thingys.html –