JavaScript 関数呼び出しは 4 つのモードに分かれています:
1. メソッド呼び出しモード: つまり、オブジェクトにはメソッド属性、Obj.methodName() または Obj[methodName]() が含まれます。
2. 関数呼び出しモード:methodName()。
3. コンストラクター呼び出しモード: new MethodName()。
4. 呼び出しモードを適用して呼び出します: ObjA.apply(ObjB,args[]) または ObjA.call(ObjB,arg1,arg2...)。
関数が呼び出されるとき、仮パラメータを受け取るだけでなく、this と引数も受け取ります。このうち、これは関数オブジェクトのコンテキストであり、引数は実際のパラメータです。
apply と call は同じ関数を実装します。つまり、関数オブジェクト (this が指す参照) のコンテキストを切り替えます。違いは、仮パラメーターが異なることです。 apply は引数または配列であり、call はカンマで区切られた複数の個別の仮パラメータです。
function add(c) { alert(this.a+this.b+c); } var test={a:1,b:2} add.call(test,3);
add.call(test,3); を実行する前は、add と test は両方とも window に属しており、この時点では this は window を指しています。 add.call(test,3); 実行時にaddメソッド本体を入力します。このとき、this.a=test.a、this.b=test.bとなります。および c は仮パラメータとして渡されます。alert() の値は 1 2 3=6 です。 applyにも同じ機能があります。
apply と call による拡張と継承:
function Animal(name){ this.name = name; this.showName = function(){ alert(this.name); } } function Cat(name){ Animal.call(this, name); } var cat = new Cat("Black Cat");//执行时,Cat函数体的this由window切换为Cat{}, // Animal函数体的this.name通过形式参数传入即为Black Cat,最终cat //得到的结果为cat=Cat{name:"Black Cat",showName: function(){ alert(this.name);}, cat.showName();//执行时this由window切换为 //Cat{name:"Black Cat",showName: function(){ alert(this.name);} 此时this.name //为this.name=Cat.name,因此为Black Cat。