3

JavaScript のメソッド「call」と「apply」については、あちこちで説明があります。ただし、を使用した関数の呼び出しに関する説明は見つかりませんでし()た。例えば:

var a = function(arg){  
    //arg.call();
    //arg.apply();
    //arg();
}

var myParam = function() {
    //do someting 
}

var instance = new a(myParam);

どの方法を使用すればよいですか? を使用してメソッドを呼び出すことの欠点は何()ですか?

4

2 に答える 2

3

オプション

関数を呼び出す方法は 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()thisnull

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

結論

これらの方法のいずれにも (顕著な) 欠点はありません。その場合に最も適切と思われること、またはあなたが最も好きなことをしてください。

于 2013-03-19T11:51:24.557 に答える
1

引数の配列を設定または渡すなど、提供.callまたは提供する「機能」が必要ない場合は、それらを使用する必要はありません。.applythis

ちょうどで関数を呼び出すことは、関数を呼び出す()「通常の」方法です。

于 2013-03-18T12:08:56.483 に答える