オプション
関数を呼び出す方法は 3 つあります。
Direct: myFunction(Object arg1, Object arg2, ...);
Call: myFunciton.call(Object this, Object arg1, Object arg2, ...);
Apply: myFunction.apply(Object this, Array args);
それぞれに独自の機能があります。call()
andの唯一の欠点は、パフォーマンスapply()
が悪いことです。いくつかの調査の結果、関数を直接呼び出すよりも少し遅いことが判明しました。検討する価値さえないほどわずかではありますが。
何を選ぶ?
大きなデメリットはないので、メリットだけで判断して選びましょう。つまり、機能を比較して、ケースに合ったものを選択してください。
.call();
関数を直接呼び出すのとは異なり、キーワード.call()
を設定できます。this
それ以外はほぼ同じです。では、なぜthis
キーワードを設定する必要があるのでしょうか。次の例を見てください。
var element = document.getElementById('my-element');
doSomething(element, function(success) {
if(success) {
// something succeeded!
// because I passed "element" as "this",
// I can use "this" to do more stuff with "element"
this.style.display = 'none';
}
});
function doSomething(element, callback) {
// do something with element
// I'm done, let's call the callback
callback.call(element, success);
}
ご覧のとおりthis
、コールバック引数の は、これまで操作してきた要素を参照しています。これが私たちが使用したいthis
理由です...それは理にかなっています! 特にオブジェクトを使用する場合。
.apply();
.call()
関数を直接呼び出すのと同じように、.apply()
別の機能が付属しています。プログラマが一連の引数を定義できるようにする代わりに、配列を使用して引数を定義できます。これにより、動的な量の引数を持つことができます。
に精通しているかもしれませんMath.max()
。この関数は未定義の数の引数を取り、最大数を返します。
Math.max(1, 2, 3); // 3
Math.max(1, 3, 2); // 3
Math.max(1, 2, 3, 2, 3, 1, 2, 3); // 3
おそらくフィードからの数値の配列があり、最大の数値を取得したい場合はどうなるでしょうか? これは明らかにうまくいきます:
var numbers = [1, 6, 2, 8, 10, 6, 13, 5, 2, 8, 7, 75, 23, 7, 12, 75];
// Prepare "max"
// Anything is greater than -Infinity
var max = -Infinity;
// Loop through all numbers
for(var i = 0; i < numbers.length; i++) {
// Compare current number with existing max
max = Math.max(max, numbers[i]);
}
ネイティブ コードで処理できる間は、すべての数値をループする貴重な時間を無駄にしています。そこで.apply()
重宝します。を設定する機能はありますが、キーワードは使用しないため、this
破棄して代わりに使用できます。配列に含まれる要素の数は関係ありません。Math.max()
this
null
var numbers = [1, 6, 2, 8, 10, 6, 13, 5, 2, 8, 7, 75, 23, 7, 12, 75];
var max = Math.max.apply(null, numbers); // Apply all array elements as an own argument
結論
これらの方法のいずれにも (顕著な) 欠点はありません。その場合に最も適切と思われること、またはあなたが最も好きなことをしてください。