3

Eloquent Javascript には、次のコード例が含まれています。

function map(func, array) {
  var result = [];
  forEach(array, function (element) {
    result.push(func(element));
  });
  return result;
}

function asArray(quasiArray, start) {
  var result = [];
  for (var i = (start || 0); i < quasiArray.length; i++)
    result.push(quasiArray[i]);
  return result;
}

function partial(func) {
  var fixedArgs = asArray(arguments, 1);
  return function(){
    return func.apply(null, fixedArgs.concat(asArray(arguments)));
  };
}

function square(x) {return x * x;}

console.log(map(partial(map, square), [[10, 100], [12, 16], [0, 1]]));

mapとは理解できますasArrayが、partial混乱します。上記の呼び出しは戻ります

[[100, 10000], [144, 256], [0, 1]]

しかし、私は方法を理解していません。ここに私の質問があります:

1)partial定義において、最初の行の変数は最後の行argumentsの変数と同じですか? argumentsそうでない場合、これらの各引数オブジェクトのソースは何ですか?

2) 上記の最後のコード行で関数呼び出しが発生すると、私の理解では、それは(つまり、square 関数を含む配列) にfixedArgsバインドされます。[square]次にconcat、2 次元配列で呼び出されます。正しい答えではない多くの問題がこれらのバインディングから発生するため、正しいものにはなりません。呼び出されたとき、部分的にバインドされた変数はどのようになっていますか?

4

3 に答える 3

3

1) 部分的な定義で、最初の行の引数変数と最後の行の引数変数は同じですか? そうでない場合、これらの各引数オブジェクトのソースは何ですか?

いいえ、そうではありません現在の関数argumentsに基づいています。最初の行では、それ自体に提供される引数であり、3 番目の行では、関数に適用される引数です。partial

仕様を引用するには:

コントロールが関数コードの実行コンテキストに入ると、引数オブジェクトが作成されます

ここで行っているのは、後で提供される引数に加えて、最初に提供された引数を適用することです。最初に与えられた引数と、呼び出し中に与えられた引数を連結して、パーシャルを作成しています。

2) 上記の最後のコード行で関数呼び出しが発生した場合、fixedArgs は [map] (つまり、map 関数を含む配列) にバインドされていると理解しています。次に、2 次元配列を使用して concat が呼び出されます。正しい答えではない多くの問題がこれらのバインディングから発生するため、正しいものにはなりません。呼び出されたとき、部分的にバインドされた変数はどのようになっていますか?

最後の行のコードが行っていることは次のとおりです。

  • partial(map, square)-最初の引数としてmap使用squareする関数を作成します。これは基本的に、配列を取得してそれを二乗する関数を作成します。

  • map(result, [[10, 100], [12, 16], [0, 1]])- これにより、マッピングが再度実行されます。今回は、配列内のすべての要素を上で宣言した関数にマップします。配列の要素は配列自体であり、上で定義した関数は配列を取り、そのすべての要素を 2 乗するため、内部配列のすべての要素を 2 乗します。

だから私たちは得ることを期待します[100,1000],...

于 2013-11-01T23:17:11.570 に答える
3

1) いいえ、違います。arguments最初の行の には、 への引数が含まれていますpartial。最後の行には、返さargumentsれた無名関数への引数が含まれています。partial

2)fixedArgs配列が含まれます[square]。から作成されたのでasArray(arguments, 1)、引数 0 (つまり ) をスキップmapし、残りのすべての引数を含みます。

于 2013-11-01T23:17:25.370 に答える
2

1)argumentsは特別な JavaScript 変数です。これは、その関数に渡されるすべての引数の配列です。したがって、これらargumentsは 2 つの異なる変数です。最初の変数は に渡される引数を参照し、2 番目の変数partialは返される関数に渡される引数を参照します。

2)partial関数は、呼び出されたときに唯一の引数として呼び出す新しい関数を返しmapますsquare。外部map呼び出しは、指定された (2 次元) 配列内のすべての配列を処理します。map各部分を処理partial(map, square)し、渡された配列内のすべての値を 2 乗する関数を準備します。

編集:間違いなくタイピングが遅すぎます。

于 2013-11-01T23:17:40.293 に答える