1

JavaScriptに関するアカデミックな質問です。

以下のコード セグメントは、整数の配列を受け取り、関数へのポインターの配列を返します。指摘された関数は、配列の 2 乗値を返すと想定されています。

入力が listOfFunction = sqFnList([1,2,3,4,5]) の場合

次に、listOfFunction[0]()1を返す必要があります

listOfFunction[1]()4を返す必要があり ます

しかし、そうではありません。

function sqFnList(a){
   var b = [];
   for ( var i = 0; i <a.length; i++)
   {
      var sq = a[i] * a[i];
      b[i] = function() { return sq;}
   }
   return b;
}

 x = sqFnList([3,4,5])[0]()

問題は x = 25 です。事前に助けてくれてありがとう。

4

2 に答える 2

4

すべての関数には、実際に関数を呼び出すとsq値を持つ同じ variable への参照が含まれます。必要なときにの値を取得するには、25関数ごとに個別のクロージャを作成し、それぞれに の値の独自のコピーを作成する必要があります。sqsq

function sqFnList(a){
   var b = [];
   for ( var i = 0; i <a.length; i++)
   {
      var sq = a[i] * a[i];
       b[i] = function (the_sq) {
          return function() { return the_sq;}
       }(sq);
   }
   return b;
}

x = sqFnList([3,4,5])[0]()  // x is 9

ここにデモンストレーションするフィドルがあります。

于 2013-05-28T17:06:14.983 に答える
2

sqにスコープされsqFnList、値を更新し続け、すべてのクロージャーで値を変更します。sq の新しいスコープを強制する必要があります。

function sqFnList(a){
   var b = [];
   for ( var i = 0; i <a.length; i++)
   {
      var sq = a[i] * a[i];
      (function(sq) {
        b[i] = function() { return sq;}
      })(sq);
   }
   return b;
}
于 2013-05-28T17:06:01.473 に答える