相同之處:
1.都是改變函數(shù)this的指向;
2.第一個(gè)參數(shù)都是要指向的對(duì)象;(第一個(gè)參數(shù)是null,undefined時(shí)蔑鹦,都會(huì)指向window)
3.都可以利用后續(xù)參數(shù)傳參贮折;
不同之處:
1.call,apply都是立即執(zhí)行函數(shù)掏导;bind返回函數(shù)芥炭;
2.call后面的參數(shù)都是和繼承函數(shù)方法的參數(shù)一一對(duì)應(yīng)漓库;
3.apply后面的參數(shù)是數(shù)組或者類(lèi)數(shù)組;
來(lái)上例子:
1.都是改變函數(shù)this的指向园蝠;call,apply都是立即執(zhí)行函數(shù)渺蒿;bind返回函數(shù);(第一個(gè)參數(shù)是null,undefined時(shí)彪薛,都會(huì)指向window)
var fn = {
? ? a:1,
? ? b:2,
? ? show:function(){
? ? ? ? console.log(this.a+','+this.b)? ??
}}
var fn1 = {
? ? ? ? ? ? a:2,
? ? ? ? ? ? b:3
};
fn.show.call(fn1);fn.show.apply(fn1);//2,3//2,3
fn.show.bind(fn1);fn.show.bind(fn1)();//?function(){? ?console.log(this.a+','+this.b) }? //2,3
補(bǔ)充一下茂装,DOM對(duì)象綁定事件也屬于方法調(diào)用模式,因此它綁定的this就是事件源DOM對(duì)象善延。如:
document.addEventListener('click',function(e){console.log(this);setTimeout(function(){console.log(this);},0);},false);//document//window少态;
setTimeout屬于回調(diào)函數(shù),第一個(gè)參數(shù)是null所以指向window;
2.var fn = {
? ? a:1,
? ? b:2,
? ? show:function(c){
? ? ? ? console.log(this.a+','+this.b+','+c)? ?}
}
var fn1 = {
? ? ? ? ? ? a:2,
? ? ? ? ? ? b:3
};
fn.show.call(fn1,5);fn.show.apply(fn1,[6]);//2,3,5//2,3,6
fn.show.bind(fn1,7)()//2,3,7
除此外, 在 ES6 的箭頭函數(shù)下, call 和 apply 將失效, 對(duì)于箭頭函數(shù)來(lái)說(shuō):
1.箭頭函數(shù)體內(nèi)的 this 對(duì)象, 就是定義時(shí)所在的對(duì)象, 而不是使用時(shí)所在的對(duì)象;所以不需要類(lèi)似于var _this = this這種丑陋的寫(xiě)法
2.箭頭函數(shù)不可以當(dāng)作構(gòu)造函數(shù)挚冤,也就是說(shuō)不可以使用 new 命令, 否則會(huì)拋出一個(gè)錯(cuò)誤
3.箭頭函數(shù)不可以使用 arguments 對(duì)象,况增,該對(duì)象在函數(shù)體內(nèi)不存在. 如果要用, 可以用 Rest 參數(shù)代替
4.不可以使用 yield 命令, 因此箭頭函數(shù)不能用作 Generator 函數(shù),