1. 程式人生 > 其它 >apply call bind 三者的比較

apply call bind 三者的比較

技術標籤: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 三者第一個引數都是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是無法生效的。