動的言語に触れたことがない場合、コンパイル言語の考え方で JavaScript を理解することは魔法のように奇妙に感じられるでしょう。なぜなら、意識的に不可能なことが頻繁に起こり、学習している場合には不合理にさえ感じるからです。 JavaScript という無料で常に変化し続ける言語の過程でこの感覚に出会ったなら、これからは「偏見」を捨ててください。これはあなたにとって間違いなく新しい大陸だからです。さて、もう話はやめて、本題に戻りましょう。まず apply メソッドと call メソッドの定義について説明します。
具体的な内容は以下の通りです:
1. メソッドの定義
call と apply は両方とも、JavaScript エンジンによって内部的に実装される Function.prototype のメソッドに属しているため、各 Function オブジェクトのインスタンス、つまり各メソッドには call 属性と apply 属性があります。これら 2 つのメソッドは同じ機能を持ちますが、使用方法が異なるため、当然ながらその使用法はメソッドに固有です。
呼び出しメソッド:
構文: call([thisObj[,arg1[, arg2[, [,.argN]]]]])
説明:
call メソッドを使用すると、別のオブジェクトに代わってメソッドを呼び出すことができます。 call メソッドは、関数のオブジェクト コンテキストを初期コンテキストから thisObj で指定された新しいオブジェクトに変更します。
適用方法:
構文: apply([thisObj[,argArray]])
argArray が有効な配列でない場合、または引数オブジェクトではない場合、TypeError が発生します。
call と apply の機能は、自分のメソッドを呼び出すのと同じように、他の人のメソッドを借用して呼び出すことです。
それらの違い:
apply: パラメータは最大 2 つだけです - 新しい this オブジェクトと配列 argArray です。このメソッドに複数のパラメーターが渡された場合、もちろん、パラメーターが 1 つしかない場合でも、すべてのパラメーターが配列に書き込まれます。 argArray が有効な配列でない場合、または引数オブジェクトではない場合、TypeError が発生します。 argArray も thisObj も指定されていない場合は、Global オブジェクトが thisObj として使用され、パラメータを渡すことはできません。call: これは直接パラメータ リストであり、主に、現在のこのインスタンス ポインタの一貫性を保つため、または特殊な状況下でこのポインタを変更するために、js オブジェクトのさまざまなメソッドが相互に呼び出すときに使用されます。 thisObj パラメータが指定されていない場合は、グローバル オブジェクトが thisObj として使用されます。
より簡単に言うと、apply と call の関数は同じですが、渡されるパラメーター リストの形式が異なります。たとえば、対応する apply 書き込みメソッド func.call(func1,var1,var2, var3) は:
func.apply(func1,[var1,var2,var3])
add.apply(sub,[3,1]); //add.call(sub,3,1); var a={ n:1, m:2, add:function(){ return this.n+this.m; } } var b={n:3,m:4 } console.log(a.add.call(b));//b.n+b.m=7 function Animal(){ this.name = "Animal"; this.showName = function(){ alert(this.name); } } function Cat(){ this.name = "Cat"; } var animal = new Animal(); var cat = new Cat(); //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。 //输入结果为"Cat" animal.showName.call(cat,","); animal.showName.apply(cat,[]);