アプリとコールの違いを簡単に理解します.

2970 ワード

JavaScriptの各Functionオブジェクトには、それぞれの方法と一つのcall方法があります.
/*apply()  */
function.apply(thisObj[, argArray])

/*call()  */
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
それぞれの定義:
apply:オブジェクトを呼び出す方法で、現在のオブジェクトを別のオブジェクトに置き換えます.例えば、B.appy(A、argments);つまり、AオブジェクトにBオブジェクトを適用する方法です.
コール:オブジェクトを呼び出す方法で、現在のオブジェクトを別のオブジェクトに置き換えます.例えば、B.cal(A、args 1、args 2);つまり、AオブジェクトがBオブジェクトを呼び出す方法です.
それらの共通点:
「他のオブジェクトの代わりに方法を呼び出すために使用できます.関数のオブジェクトコンテキストを初期のコンテキストからthisObjに指定された新しいオブジェクトに変更します.」
それらの違い:
apply:最大2つのパラメータしかありません.新しいthisオブジェクトと一つの配列argAray.この方法に複数のパラメータを渡すと、この配列にパラメータを書き込みます.もちろん、一つのパラメータだけでも、配列に書き込みます.argArayが有効な配列またはargmentsオブジェクトでない場合、Type Errorにつながる.argArayおよびthisObjのいずれかのパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用され、任意のパラメータを伝達することができない.
call:複数のパラメータを受け入れることができます.最初のパラメータはappyと同じです.後ろはパラメータリストです.この方法は、主にjsオブジェクトの各方法で呼び出したときに、現在のthisインスタンスポインタを一致させるために使用され、または特別な場合にはthisポインタを変更する必要がある.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される. 
実際には、applyとcallの機能は同じですが、入ってきたパラメータのリスト形式は違っています.
サンプルコード:
(1)基本的な使い方
function add(a,b){
  return a+b;  
}
function sub(a,b){
  return a-b;  
}
var a1 = add.apply(sub,[4,2]);  //sub  add   
var a2 = sub.apply(add,[4,2]);
alert(a1);  //6     
alert(a2);  //2

/*call   */
var a1 = add.call(sub,4,2);
(2)継承の実現
function Animal(name){
  this.name = name;
  this.showName = function(){
        alert(this.name);    
    }    
}

function Cat(name){
  Animal.apply(this,[name]);    
}

var cat = new Cat("  ");
cat.showName();

/*call   */
Animal.call(this,name);
 (3)複数引き継ぎ
function Class10(){
  this.showSub = function(a,b){
        alert(a - b);
    }   
}

function Class11(){
  this.showAdd = function(a,b){
        alert(a + b);
    }  
}

function Class12(){
  Class10.apply(this);
  Class11.apply(this);   
  // Class10.call(this);
  //Class11.call(this);  
}

var c2 = new Class12();
c2.showSub(3,1);    //2
c2.showAdd(3,1);    //4
滑らかな記憶:
猫は魚を食べ、犬は肉を食べ、ウルトラマンは怪獣ちゃんを殴る.
天狗が魚を食べたいです.
猫は魚を食べます.call(犬、魚)
犬は魚を食べました
天狗が魚とエビと肉を食べたいです.
猫が魚を食べます.apple(犬、魚、エビ、肉)
または猫が魚・call(犬、魚、エビ、肉)を食べます.
猫が精になりました.怪獣を打ちたいです.
ウルトラマン.小怪獣.call(猫、小怪獣)
このように覚えました.