1. 程式人生 > >JavaScript中 call 與 apply、bind 的使用

JavaScript中 call 與 apply、bind 的使用

今天遇到一道關於call與apply使用的題目,在此總結一下關於 call 與 apply 的使用方法。

題目如下:以下程式執行結果為3的選項是?

var a = {X:1,Y:2};
var b = {
    X:2,
    Y:2,
    add:function(){
        return this.X+ this.Y;
    }
};

console.log(b.add.call(a));      //3
console.log(b.add.apply(a));     //3
console.log(b.excute('1+3'));    //報錯
console.log(b.add.bind(a));      //返回函式

題目解析:

  • console.log(b.add.call(a));

    通過call(obj)方法將物件b的add方法新增到物件a下。此時a物件為:
    var a = {
    X:2,
    Y:2,
    add:function(){
    return this.X+ this.Y;
    }
    };
    因此,很好理解執行結果為3了。

  • console.log(b.add.apply(a));

    在此時與以上方法相同,它們的區別寫在後面。

  • console.log(b.excute(‘1+3’));

    物件b下沒有excute這個方法,則報錯。

  • console.log(b.add.bind(a));

    此方法將b.add()方法繫結在a下,相當於為a添加了add()方法,但是不是真的複製,執行a.add()也會顯示在物件a下找不到add方法。要想顯示結果3,可修改為console.log(b.add.bind(a)())。

call 與 apply 方法解讀
call 與 apply 都存在於這樣的環境下,物件a想要使用物件b中方法,自己比較懶,不想再新建,就出現了call和apply方法,直接使用物件b的方法。

  • 定義:
    呼叫一個物件的一個方法,以另一個物件替換當前物件。

  • 區別
    根據方法格式就可以看出區別啦!
    call([thisObj[,arg1[, arg2[,[,.argN]]]]]);
    apply([thisObj[,argArray]]);

    區別在於 apply的第二個引數必須是陣列或者arguments(引數陣列)。call 的第二個引數可以是任意型別,如果為方法傳遞多個引數,call方法必須逐個制定引數。
    3.說明
    在call 方法中,如果沒有提供 thisObj 引數,那麼全域性物件被用作 thisObj。
    在apply方法中,如果 argArray 不是一個有效的陣列或者不是 arguments 物件,那麼將導致一個 TypeError。 如果沒有提供 argArray 和 thisObj 任何一個引數,那麼 全域性物件將被用作 thisObj, 並且無法被傳遞任何引數。
    4.bind()方法
    看到一篇總結的比較好的文章,點開了解詳細資訊吧!Javascript中bind()方法的使用與實現