apply call bind 三者的比較
阿新 • • 發佈:2021-01-09
技術標籤:js
apply、call、bind三者相比較,之間又有什麼異同呢?何時使用apply、call,何時使用bind呢?舉個簡單的例子:
var obj = {
x : 81,
};
var foo = {
getX: function () {
return this.x;s
}
};
console.log(foo.getX.bind(obj)()),
console.log(foo.getX.call(obj)),
console.log(foo.getX.apply(obj))
列印結果:
三個輸出的都是81,但是注意看使用bind()方法的,他後面多了對括號。
也就是說,區別是,當你希望改變上下文環境之後並非立即執行,而是回撥執行的時候,使用bind)方法。而 apply/call則會立即執行函式。
apply、call區別
對於apply、call二者而言,作用完全一樣,只是接受引數的方式不太一樣。例如,有一個函式定義如下:
var func = fuction( arg1 , arg2 ) {
};
呼叫:
func.call( this , arg1 , arg2 );
func.apply( this, [ arg1 , arg2 ])
總結:
apply . call . bind 三者都是用來改變函式的this物件的指向的;
apply . call . bind三者都可以利用後續引數傳參;
bind是返回對應函式,便於稍後呼叫; apply . call則是立即呼叫。
有個有趣的問題,如果連續bind()兩次,亦或者是連續bind()三次那麼輸出的值是什麼呢?像這樣:
var bar = function(){
console.log(this.x)
}
var foo = {
x : 3
}
var sed = {
x : 4
}
var func = bar.bind(foo).bind(sed)
func()
var fiv = {
x : 5
}
var func = bar.bind(foo).bind(sed).bind(fiv)
func()
列印結果如下:
答案是,兩次都仍將輸出3,而非期待中的4和5。原因是,在Javascript中,多次bind()是無效的。更深層次的原因,bind()的實現,相當於使用函式在內部包了一個call / apply,第二次bind()相當於再包住第一次bind(),故第二次以後的bind是無法生效的。