apply與call都是為了動(dòng)態(tài)改變this而出現(xiàn)的
首先補(bǔ)充知識(shí)點(diǎn):
this
javascript的一個(gè)關(guān)鍵字,代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象。隨著函數(shù)使用場合的不同,this的值會(huì)發(fā)生變化。但是有一個(gè)總的原則,那就是this指的是,調(diào)用函數(shù)的那個(gè)對(duì)象。
- 在頁面中,
this可以表示全局對(duì)象,方法的調(diào)用對(duì)象。 - 在
nodejs中,不太一樣,一個(gè)js文件就是一個(gè)module.exports,this一般指這個(gè)module.exports,或者內(nèi)部方法的調(diào)用對(duì)象
apply與call
前面已經(jīng)說了applce call是函數(shù)對(duì)象的方法,允許切換函數(shù)執(zhí)行的上下文環(huán)境(context),也就是this在函數(shù)中綁定的對(duì)象,
區(qū)別是:
Function.apply(object,[ ]) //后面?zhèn)鲄?shù)以數(shù)組的形式
Function.call(object,...params) //后面?zhèn)鲄?shù)分開傳輸?shù)?
舉個(gè)例子
function Cat(hello){
this.name = "cat";
this.msg = "i am cat";
this.say = function(){
alert(this.name + " say :" + this.msg);
}
}
var cat = new Cat("i am a cat");
cat.say(); //cat say: i am a cat
var cat = new Cat("i am a cat");
cat.say(); //cat say: i am a cat
var dog = {name:"dog",msg:"i am a dog"};
cat.say.apply(dog); // dog say :i am a dog
新建一個(gè)cat,cat有方法say,但是dog沒有方法say,使用apply就是把執(zhí)行方法say的this或者叫上下文,變成了dog,這時(shí)this.name和this.msg就是dog的name和msg了