0

関数が与えられたとします (それはオブジェクトの一部です。心配しないでください)。

makeClosures : function(arr, fn) {},

ここで、パラメータは、最初に配列、たとえば[1, 2, 3, 4]、2 番目に、指定された数値を 2 乗する関数 (doSomeStuff と呼びます) です。

var doSomeStuff = function (x) { return x * x; }

makeClosuresは、 と同じサイズの配列を返すことになっていarrます。各要素には、基本的に を呼び出す関数への参照が含まれていますdoSomeStuff

だからここに私の実装があります:

makeClosures : function(arr, fn) {
  var funcs = [];

  for (var i = 0; i < arr.length; i++) {
    var f = function() {
      return fn(arr[i]);
    };

    funcs.push(f);
  }

  return funcs;
},

質問は次のとおりです。

プログラムを実行すると、 の戻り値fNaN. 実際の数値 ( return fn[1], return fn(arr[0])) を試してみたところ、うまくいきました。これは、問題が発生していることを意味しますarr[i](未定義?)。内部関数fが loop index を認識していないと思われますi。なんで?

4

2 に答える 2

0

ポインティのコメント:

「JavaScriptでは、字句スコープは関数レベルで発生します。ループ内に構築されたすべての関数は、同じ変数「i」を共有します。ループの最後で、「i」の値は何ですか?右:arr.length。何ですか。 arr [arr.length]の値?」

返される関数はループの反復後に実行され、var iは、配列の範囲外であるarray.lengthの値でスコープ内にあります。

また、forループの外側でfを宣言する必要があります。スコープはループの内側ではなく関数レベルで作成されるため、ループの各反復にすでに存在する場合はfを宣言します。

于 2013-01-05T22:13:07.523 に答える
-1

天気がよくわからないのですが、これが私が試したものです。

var arr = [1, 2, 3, 4]
var fn = function (x) { return x * x; }

function makeClosures(arr, fn) {
    var funcs = [];   

    for (var i = 0; i < arr.length; i++) {     

        var f =  fn(arr[i]);       

        funcs.push(f);
    }

    return funcs;
}

myarr = makeClosures(arr, fn);

for (var j = 0; j < myarr.length; j++) {
    alert(arr[j] + ' square is : ' + myarr[j]);
}
于 2013-01-05T22:35:41.070 に答える