2017-09-29 2 views
1

applycall関数です:適用オーバーコールを使用するタイミングは今や構文が広がっているためですか?以下

function.apply(context, [args])

function.call(context, arg1, arg2, ...)

我々はapplycalldifferenceを知っている:

違いは、あなたが で機能を呼び出すことができますように適用されます引数は配列です。呼び出しには、パラメータが明示的に にリストされている必要があります。

今、私たちは構文が広がっている、我々は簡単にapplyが何をやってcallを使用することができます。

function.call(context, ...[args])

だから、スプレッド構文で、我々はcallapplyを使用しないとき? apply機能を廃止できるかどうか不思議です。

+1

を使用すると、関数型プログラミングスタイルで機能パイプラインを構築している場合は、まだ理にかなって適用します。詳細を知りたい場合は、ポイントフリープログラミングをお読みください。 – Tex

答えて

3

argsは、アレイのような反復可能であることを考えると、それは

function.call(context, ...args); 
// vs 
function.apply(context, args); 

そしてapplyが短くなっています。

applyはネイティブなので、広範な引数を持つcallよりも高速です。違いはブラウザのバージョンによって異なります(最近のChrome/V8)または抜本的な(Firefox、古いChrome/V8)。場合によっては、この懸念は予備的な最適化と考えられます。

スプレッドシンタックスの最適化の有無に応じて、ブラウザのバージョンによって結果が異なる場合があります。arguments以前のアレイのようなargumentsは、特にV8のapplyで最適化を停止させる可能性がありました。これは、スプレッド構文をサポートする最新のエンジンでもはや問題にはなりません。

引数が配列的ではあるが反復可能でない場合、実際の違いが表示されます。たとえば、argumentsが繰り返し可能になったのはnot so long ago...argumentsは普及構文をサポートしていても古いブラウザバージョンでは失敗します。 callは、安全装置が必要になるのでそうapplyは、ここに好ましい。一方

function.call(context, ...Array.from(arguments)); 
// vs 
function.apply(context, arguments); 

引数は反復可能あまりにも、配列に似ていない場合は、実用的な違いがあります。 applyが配列-同類を受け入れ、callは好ましいこととそう速くなりますので:

function.call(context, ...set); 
// vs 
function.apply(context, [...set]); 
関連する問題