JS中apply和call的聯繫和區別

JS中有時常用到 apply 和 call 兩個方法,搜索網上很多,整理如下,簡單看看這兩個聯繫和區別,

聯繫:

網上查到關於apply和call的定義:這兩個方法都能劫持另外一個對象的方法,繼承另外一個對象的屬性.

xxxFunction.apply(obj,args) 方法接收兩個參數
obj
:這個對象將代替xxxFunction類裏this對象,也即xxxFunction類(函數)裏的this不在是指 xxxFunction 本身,而是obj;
args:這個是數組類型的參數,它將作爲參數傳給Function(args --> arguments)
結果是還是執行 xxxFunction 類方法(函數)的功能,只不過該 xxxFunction 函數以另一個目標對象和一個數組作爲參數傳遞進 xxxFunction 函數,xxxFunction函數裏面的 this 是傳進的目標對象,二不是 xxxFunction 本身;

call:和apply類似的,只不過是參數列表不一樣.

xxxFunction.call(obj,[param1[,param2[,...[,paramN]]]])
obj
:這個對象將代替xxxFunction類裏this對象,(跟apply中的obj一樣);
params:這個是一個參數列表(即逗號隔開的零個或多個參數),不是數組;
結果是還是執行 xxxFunction 類方法(函數)的功能,只不過該 xxxFunction 函數以另一個目標對象和一個參數列表[即用逗號隔開的零或多個參數]作爲參數傳遞進 xxxFunction 函數,xxxFunction函數裏面的 this 是傳進的目標對象,二不是 xxxFunction 本身;


區別:
用法上不同,主要是參數不完全同

function Person(name,age) {  
this.name=name;  
this.age=age;  
this.money = 500;
} 

function myFun(money) {		
	alert(this.money);
}

var money = 100;
myFun(money); 
//return 100;  //window.myFun(money); save to myFun(money);
//這個時候this指向的是window對象,其實myFun函數和定義的var money = 100;都作爲window對象子對象(即全局對象)

myFun.apply(window,[]);  //save to window.myFun.apply(window,[]);  
//return 100;  //同上

myFun.apply(new Person('zhangsan',23),[]);  
//return 500, 空數組作爲參數,僅符合語法要求
//這個時候myFun方法裏面的this指向的是new Person('zhangsan',23)對象,二不是myFun類(函數),故彈出500

myFun.call(new Person('zhangsan',23),money,300,'mycardId');  
//return 500, 後面money,300和mycardId是參數列表作爲參數,一一列出
//這個時候myFun方法裏面的this指向的是new Person('zhangsan',23)對象,二不是myFun類(函數),故彈出500


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章