1

この記事では、ジョン・レシグがカリー化のためのこのスニペットについて説明しています。

Function.prototype.curry = function() {
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function() {
      return fn.apply(this, args.concat(
        Array.prototype.slice.call(arguments)));
    };
  };

私は表現について混乱していますArray.prototype.slice.call(arguments)

  1. ここで、「arguments」は配列のslice()メソッドに対する「this」引数ですが、「slice()」には引数自体が必要なので、のようなことをする必要があると思いますArray.prototype.slice.call(arguments, <someIndex>)。そのコードがどのように機能するのかわかりません。

  2. 「arguments」に関するドキュメントによると、「arguments」は実際には配列ではなく、オブジェクトのような配列にすぎません。その上で「slice()」をどのように呼び出していますか?また、コードconsole.log(arguments.slice())を入力すると、オブジェクトにスライスメソッドがないというエラーが表示されます。

何が起きてる?

4

2 に答える 2

4

最初の質問への回答:

引数なしで配列に対してsliceを呼び出すと、配列のコピーが返されます。Array.prototype.slice.call(arguments)同じことを行いますが、argumentsオブジェクトを操作して配列を返します。

2番目の質問への回答:

argumentsこれは「一般的な」メソッドであるため、スライスを呼び出すことができます(ここの注を参照)。argumentsオブジェクトをとして渡すとthissliceは配列として扱います。argumentsはプロパティを含む配列のようなオブジェクトなので、正常に機能します。length

于 2013-03-26T20:59:47.193 に答える
3

toの引数.slice()はオプションです。存在しない場合、関数は元の配列(または配列のようなオブジェクト)のコピーを返すだけです。

この関数は、オブジェクト.slice()の「長さ」プロパティの存在を気にするだけです。thisしたがって、「引数」には「長さ」のプロパティがあるので、.slice()満足しています。

于 2013-03-26T20:58:54.280 に答える