2

Javascript を使用していくつかのコードを記述します。私たちがやるべきことは次のとおりです。

「クロージャーを使用して JavaScript フィボナッチ数を実装します。具体的には、最初は 0 と 1 の 2 つの連続するフィボナッチ数を格納する関数を記述します。この関数は、ネストされた関数 getNext() も定義して返します。getNext() 関数は、格納されている 2 つのフィボナッチ数を更新します。次の 2 つのフィボナッチ数に戻り、現在の数を返します。たとえば、getNext() の最初の呼び出しでは戻り値は 0 で、次の呼び出しでは 1、次に 1、次に 2 などです。"

私はこれを理解していますが、実際にはそうではありません。誰かが明確にするのを助けることができますか?ありがとう!

4

4 に答える 4

9

クロージャーの背後にある基本的な考え方は、クローザーはすべてのローカル データを値でバインドするため、クローザーを使用して、生成された関数のその「インスタンス」に対してのみローカルな変数を初期化してから変更できるということです。

これは宿題のように思えるので、クロージャーを使用して別の質問に答えます。クロージャーを使用して、完全な正方形 (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

うまくいけば、それはそれを少し説明するのに役立ちますか?そうでない場合は、コメントを残してください。:-)

于 2011-02-07T20:56:15.523 に答える
1
    var fibonacci = (function () {
        var arr = [0, 1];
        return function () {
            var num = arr[arr.length - 1],
                len = arr.length;
            arr.push(arr[len - 1] + arr[len - 2]);
            return num;
        };
    }());

    //test
    var i;
    for (i = 0; i < 10; i++) {
        console.log(fibonacci());
    }
   //1,1,2,3,5,8,13,21,34,55

http://sarathsaleem.github.com/JavaScriptTasks/の説明を参照してください。

この質問への回答としてこれを行いました 最初に 2 回 1、次に 2、次に 3、次に 5 などを返す関数を作成します (フィボナッチ数)。グローバル変数は使用しないでください。

于 2013-03-11T19:21:10.970 に答える