call と apply の最初の実パラメータは、呼び出される関数の親オブジェクトであり、それへの参照は関数本体の this を通じて取得されます。
たとえば、関数 f をオブジェクト o のメソッドとして呼び出したい場合は、次のように call メソッドと apply メソッドを使用できます。
f.call(o);
f.apply(o);
は次のとおりです。次のように理解されます:
o.m = f; / Store f as o 一時メソッド
o.m(); // この一時メソッドを呼び出します
delete o.m; // この一時メソッドを削除します
例を示します。
function testFun(){
return this.a this.b;
}
var o = {a:1, b:2};
testFun.call(o); //3
testFun.apply(o); //3
上記コードの実行結果はいずれも 3 であり、return o.a o.b と理解できます。
呼び出しメソッドと適用メソッドの最初の実パラメータが null または未定義の場合はどうなるのかという質問を考えてみましょう。次の例を見てみましょう:
var a = 10, b = 20;
function testFun(){
return this.a this.b;
}
testFun.call();
testFun.apply();
上記のコードの実行結果はすべて 30 です。これは、call および apply の最初の実パラメータが null または未定義として渡された場合、グローバル オブジェクトに置き換えられるためです。
call と apply の 2 つのメソッドの違いは何ですか?
call メソッドの場合、最初の呼び出しコンテキスト パラメーター以降の実パラメーターはすべて、呼び出される関数に渡される値です。たとえば、関数 f をオブジェクト o のメソッドとして呼び出し、2 つのパラメーターを渡すには、次のコードを使用できます。
f.call(o, 1, 2);
apply メソッドは、最初の実パラメータの後のすべての実パラメータを適用します。それを配列に入れます。
f.apply (o, [1, 2]);
例を挙げてみましょう
function testFun(x, y){
return this.a this.b x y;
}
var o = {a:1, b: 2};
testFun.call(o, 10, 20);
testFun.apply(o, [10, 20]);
上記のコードの実行結果は次のようになります。 33、これは return o.a o.b 10 20 として理解できます。