1蜘犁、call
var a = {
? ? user:"you",
? ? fn:function(){
? ? ? ? console.log(this.user);
? ? }
}
var b = a.fn;
b();//undefined
b.call(a);//you
//通過(guò)在call方法翰苫,給第一個(gè)參數(shù)添加要把b添加到哪個(gè)環(huán)境中,簡(jiǎn)單來(lái)說(shuō),this就會(huì)指向那個(gè)對(duì)象奏窑。
//call方法除了第一個(gè)參數(shù)以外還可以添加多個(gè)參數(shù)导披,如下:
var a = {
? ? user:"you",
? ? fn:function(e,ee){
? ? ? ? console.log(this.user); //you
? ? ? ? console.log(e+ee); //3
? ? }
}
var b = a.fn;
b.call(a,1,2);
2、apply()
//apply方法和call方法有些相似埃唯,它也可以改變this的指向
var a = {
? ? user:"you",
? ? fn:function(){
? ? ? ? console.log(this.user); //you
? ? }
}
var b = a.fn;
b.apply(a);
//同樣apply也可以有多個(gè)參數(shù)撩匕,但是不同的是,第二個(gè)參數(shù)必須是一個(gè)數(shù)組墨叛,如下:
var a = {
? ? user:"you",
? ? fn:function(e,ee){
? ? ? ? console.log(this.user); //you
? ? ? ? console.log(e+ee); //11
? ? }
}
var b = a.fn;
b.apply(a,[10,1]);
//注意如果call和apply的第一個(gè)參數(shù)寫(xiě)的是null止毕,那么this指向的是window對(duì)象
3、bind()
//bind方法和call漠趁、apply方法有些不同扁凛,但是不管怎么說(shuō)它們都可以用來(lái)改變this的指向。
//不同
var a = {
? ? user:"you",
? ? fn:function(){
? ? ? ? console.log(this.user);
? ? }
}
var b = a.fn;
b.bind(a);
//我們發(fā)現(xiàn)代碼沒(méi)有被打印闯传,對(duì)谨朝,這就是bind和call、apply方法的不同甥绿,實(shí)際上bind方法返回的是一個(gè)修改過(guò)后的函數(shù)字币。
于是
var c = b.bind(a);
console.log(c); //function() { [native code] }
//同樣bind也可以有多個(gè)參數(shù),并且參數(shù)可以執(zhí)行的時(shí)候再次添加共缕,但是要注意的是纬朝,參數(shù)是按照形參的順序進(jìn)行的。
var a = {
? ? user:"you",
? ? fn:function(e,d,f){
? ? ? ? console.log(this.user); //you
? ? ? ? console.log(e,d,f); //10 1 2
? ? }
}
var b = a.fn;
var c = b.bind(a,10);
c(1,2);
//總結(jié):call和apply都是改變上下文中的this并立即執(zhí)行這個(gè)函數(shù)骄呼,bind方法可以讓對(duì)應(yīng)的函數(shù)想什么時(shí)候調(diào)就什么時(shí)候調(diào)用共苛,并且可以將參數(shù)在執(zhí)行的時(shí)候添加,這是它們的區(qū)別蜓萄,根據(jù)自己的實(shí)際情況來(lái)選擇使用隅茎。