call、apply、bind應用的介紹

call、apply、bind應用的介紹


call

call() 方法調用一個函數, 其具備一個指定的 this 值和分別地提供的參數(參數的列表)。javascript

注意:該方法的做用和 `apply()` 方法相似,只有一個區別,就是 `call()` 方法接受的是若干個參數的列表,而 `apply()` 方法接受的是一個包含多個參數的數組。 java

語法:數組

fun.call(thisArg[, arg1[, arg2[, ...]]])
複製代碼

參數:app

  • thisArgdom

    • 在 fun 函數運行時指定的 this 值
    • 若是指定了 null 或者 undefined 則內部 this 指向 window
  • arg1, arg2, ...函數

    • 指定的參數列表

apply

apply() 方法調用一個函數, 其具備一個指定的 this 值,以及做爲一個數組(或相似數組的對象)提供的參數。ui

注意:該方法的做用和 `call()` 方法相似,只有一個區別,就是 `call()` 方法接受的是若干個參數的列表,而 `apply()` 方法接受的是一個包含多個參數的數組。 this

語法:spa

fun.apply(thisArg, [argsArray])
複製代碼

參數:prototype

  • thisArg
  • argsArray

apply()call() 很是類似,不一樣之處在於提供參數的方式。 apply() 使用參數數組而不是一組參數列表。例如:

fun.apply(this, ['eat', 'bananas'])
複製代碼

==call 與apply的區別:== apply、call 的區別

對於 apply、call 兩者而言,做用徹底同樣,只是接受參數的方式不太同樣。例如,有一個函數定義以下:

var func = function(arg1, arg2) {
     
};
複製代碼

就能夠經過以下方式來調用:

func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])
複製代碼

其中 this 是你想指定的上下文,他能夠是任何一個 JavaScript 對象(JavaScript 中一切皆對象),call 須要把參數按順序傳遞進去,而 apply 則是把參數放在數組裏。  

bind

bind() 函數會建立一個新函數(稱爲綁定函數),新函數與被調函數(綁定函數的目標函數)具備相同的函數體(在 ECMAScript 5 規範中內置的call屬性)。 當目標函數被調用時 this 值綁定到 bind() 的第一個參數,該參數不能被重寫。綁定函數被調用時,bind() 也接受預設的參數提供給原函數。 一個綁定函數也能使用new操做符建立對象:這種行爲就像把原函數當成構造器。提供的 this 值被忽略,同時調用時的參數被提供給模擬函數。

語法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])
複製代碼

參數:

  • thisArg

    • 當綁定函數被調用時,該參數會做爲原函數運行時的 this 指向。當使用new 操做符調用綁定函數時,該參數無效。
  • arg1, arg2, ...

    • 當綁定函數被調用時,這些參數將置於實參以前傳遞給被綁定的方法。

返回值:

返回由指定的this值和初始化參數改造的原函數拷貝。

示例:

function LateBloomer() {
  this.petalCount = Math.ceil(Math.random() * 12) + 1;
}

// Declare bloom after a delay of 1 second
LateBloomer.prototype.bloom = function() {
  window.setTimeout(this.declare.bind(this), 1000);
};

LateBloomer.prototype.declare = function() {
  console.log('I am a beautiful flower with ' +
    this.petalCount + ' petals!');
};

var flower = new LateBloomer();
flower.bloom();  // 一秒鐘後, 調用'declare'方法
複製代碼

小結

  • call 和 apply 特性同樣

    • 都是用來調用函數,並且是當即調用
    • 可是能夠在調用函數的同時,經過第一個參數指定函數內部 this 的指向
    • call 調用的時候,參數必須以參數列表的形式進行傳遞,也就是以逗號分隔的方式依次傳遞便可
    • apply 調用的時候,參數必須是一個數組,而後在執行的時候,會將數組內部的元素一個一個拿出來,與形參一一對應進行傳遞
    • 若是第一個參數指定了 null 或者 undefined 則內部 this 指向 window
  • bind

    • 能夠用來指定內部 this 的指向,而後生成一個改變了 this 指向的新的函數
    • 它和 call、apply 最大的區別是:bind 不會調用
    • bind 支持傳遞參數,它的傳參方式比較特殊,一共有兩個位置能夠傳遞
        1. 在 bind 的同時,以參數列表的形式進行傳遞
        1. 在調用的時候,以參數列表的形式進行傳遞
      • 那到底以誰 bind 的時候傳遞的參數爲準呢仍是以調用的時候傳遞的參數爲準
      • 二者合併:bind 的時候傳遞的參數和調用的時候傳遞的參數會合併到一塊兒,傳遞到函數內部
相關文章
相關標籤/搜索