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