0

Oreilly.JavaScript.The.Good.Partsには、次のようなコードがあります。

Function.method('curry', function () { 
    var slice = Array.prototype.slice, 
        args = slice.apply(arguments),
        that = this; 
    return function () {
         return that.apply(null, args.concat(slice.apply(arguments)));
     };
});

プライベート変数の代わりに Array.prototype.slice を直接使用しないのはなぜだろうか、ありがとう。

4

3 に答える 3

1

あればいいと思いますが、必須ではありません。つまり、どちらの方法でも機能します。

エイリアスを使用すると、読みやすくなります (解析するコードが少ないため)。

カリー化されたメソッドが非常に頻繁に呼び出される場合、JavaScript は複雑なルールを逆参照Arrayしてからprototype.

最後に、誰かがArray.prototype.slice後で上書きする可能性があります (可能性は低い) か、作成者がこの関数呼び出しのために上書きした可能性があります (これも可能性は低いです)。そのため、コードは、後で呼び出したときに、すぐに実行したかのように動作するようにします。

于 2013-03-11T10:33:06.957 に答える
0

を定義sliceしなくても機能しますが、この関数には2つの呼び出しがあるArray.prototype.sliceため、見栄えを良くするために「ショートカット」を定義することをお勧めします(コードを短くし、冗長性を減らします)。

于 2013-03-11T10:30:30.273 に答える
0

パフォーマンスの観点から、slice次のコードで が 2 回使用されています。ショートカットを使用すると、入力するコードの長さと検索プロセスの両方が削減されます。

ローカル変数にスライスがある場合、それにアクセスするときに必要な単一のルックアップがあります。

  • getVar「スライス」

対照的に、使用するとArray.prototype.slice通常、いくつかの「命令」に変換されます。

  • getVar "配列"
  • getMember "プロトタイプ"
  • getMember「スライス」

slice縮小の観点から、Google コンパイラなどのツールは、ローカル変数 (この場合は) の名前を 1 文字の変数に変更することで、コードのサイズをさらに縮小します。これは、スコープ外でアクセスされるグローバル変数では発生しません (その場合Array.prototype.slice)。

機能的な観点からArray.prototype.sliceは、動的に解決されるため、後で変更できます。Array.prototype.slice その時点で が指す関数オブジェクトにローカル参照を割り当てることで、現在自分自身が保持している関数参照を他のコードが変更できないことが保証されます。

于 2013-03-11T10:31:47.737 に答える