2

Crockford on Javascript - Act III: Function the Ultimateを 41 分 26 秒あたりで見ています。彼の画面上のコードは、私にエラーを引き起こすarguments.slice()方法で使用されています。

function curry(func){
    var args = arguments.slice(1);
    ...
}

彼は次のように説明しています。

最初の引数は関数であり、必要ないため、最初の引数を除いて、最初に引数の配列を取得します。この場合、私は ES5 を使用していると仮定しているので、ひどい Array.prototype.apply()トリックはしていません。

問題は、実行すると次のarguments.slice()エラーが発生することです。

Uncaught TypeError: arguments.slice is not a function

私は間違いなくES5を搭載した最新のブラウザでテストしています! コードを機能させる唯一の方法は、「ひどい」トリックを使用することです(彼はそう呼んでいますArray.prototype.slice.apply(arguments, [1])[].slice.call(arguments, 1);.

彼はただ間違っていますか?彼のスライドにはタイプミスがありますか? arguments.slice()ES5 ブラウザで動作しないのはなぜですか?

4

3 に答える 3

-2

argumentsオブジェクトは配列ではありません。これは Array (Array like) に似ていますが、 以外の Array プロパティはありませんlength

上記のトリックを使用して、最初に配列に変換する必要があります。

var slice = Array.prototype.slice;
function curry(func){
    var args = slice.call(arguments, 1); // converts into array
}

引数は配列からすべてのプロトタイプ メソッドを継承する予定でしたが、最終ドラフトではこの機能が削除されました。

https://mail.mozilla.org/pipermail/es5-discuss/2009-August/003112.html

Arguments オブジェクトが WebKit の Array から継承されるようにするロジックを先週の金曜日に実装したところ、すぐに
Prototype.js との深刻な非互換性が明らかになりました... これにより、少なくとも多くの Apple サイトと Nasa.gov が壊れます -- ..かなり主要なライブラリの主要な互換性の問題によって引き起こされたこれらのサイトの破損により、 配列のような動作を引数
に後付けしようとすることは実行不可能に思えます。

そのため、最終的には、ウェブページが壊れないように全員にコードの変更を強制する代わりに、この変更を元に戻しました。したがって、ES5 でも、上記のトリックを適用して引数を実際の配列に変換する必要があります。

于 2015-06-27T01:57:20.997 に答える