javascript callとapply詳細


一、文法(jsマニュアル)
コール方法は、オブジェクトを別のオブジェクトに置き換える方法を呼び出します.call([thisObj],arg 1[,arg 2[,   [.argN]]]パラメータ
thisObjオプションがあります.現在のオブジェクトとして使用されます.arg 1、arg 2、  , argNオプションができます.転送される方法のパラメータ系列を指定します.
説明
コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.
オブジェクトを別のオブジェクトに置き換える方法を適用します.
apply([thisObj[,argAray])
パラメータ
thisObj
オプションを選択します.現在のオブジェクトとして使用されます.
アーガイア
オプションを選択します.この関数のパラメータ配列に渡されます.
説明
もしargArayが有効な配列ではないか、またはargmentsオブジェクトではないなら、TypeErrorを引き起こすことになります.
argArayおよびthisObjのいずれかのパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用され、任意のパラメータを伝達することができない.
二、例
var obj=new function(){this.name="  "}
    var myfunc=function(x){
    	var name="fengshu";
    	console.log(this.name);
    	console.log(x);
    }
    myfunc.call(obj,"args");
    myfunc.apply(obj,["args"]);//apply      ,       ,     
上記の例から分かるように、callとappyの違いは伝達パラメータの形が違っているだけで、appyは配列を通してパラメータを伝達し、callは2番目のパラメータから起動方法に伝達されるパラメータです.
applyとcallの最初のパラメータは、呼び出し方法thisが実際に指し示す対象と考えられます.主に次のような種類に分けられます.
1、Function.cal()この場合の方法のthis値はグローバル変数です.
2、Function.callは依然としてグローバル変数を指しています. 
3、Function.call thisとは、関数自体の内部変数のことです.
4、Function.call(new Obj()thisとは、このオブジェクトのことです.
三、拡張 
私たちはcallとappyを通じて、簡単で柔軟に引継ぎができます.
function Obj1(){
	this.calculate=function(x,y)
	{
		return x+y;
	}
	this.name="add";

}
function  Obj2(){
	this.calculate=function(x,y)
	{
		return x*y;
	}

	this.name="sub";

}

function Obj3(){

	this.calculate=function(x,y)
	{
		return x/y;
	}
	this.name="dev";

};




function test(x,y)
{
	var type=this.name;
	var result=this.calculate(x,y);
	console.log(type,result);
	return result;
}

test.call(new Obj1(),10,5);
test.call(new Obj2(),10,5);
test.call(new Obj3(),10,5);