call/apply/bind方法的來源
首先,在使用call,apply,bind方法時,我們有必要知道這三個方法究竟是來自哪裡?為什麼可以使用的到這三個方法?
call,apply,bind這三個方法其實都是繼承自Function.prototype中的,屬於實例方法。
console.log(Function.prototype.hasOwnProperty('call')) //true console.log(Function.prototype.hasOwnProperty('apply')) //true console.log(Function.prototype.hasOwnProperty('bind')) //true
上面程式碼中,都回傳了true,表示三種方法都是繼承自Function.prototype的。當然,普通的對象,函數,數組都繼承了Function.prototype對像中的三個方法,所以這三個方法都可以在對象,數組,函數中使用。
綁定回呼函數的物件
如果在回呼函數中使用this對象,那麼this物件就是會指向DOM對象,也就是button物件。如果要解決回呼函數中this指向問題,可以用下列方法。
var o = { f: function() { console.log(this === o); } } $('#button').on('click', function() { o.f.apply(o); //或者 o.f.call(o); //或者 o.f.bind(o)(); });
點擊按鈕以後,控制台將會顯示true。由於apply方法(或call方法)不僅綁定函數執行時所在的對象,還會立即執行函數(而bind方法不會立即執行,注意區別),因此不得不把綁定語句寫在一個函數體內。
call,apply,bind方法的聯繫和區別
其實用於指定函數內部的this指向的問題,這三個方法都差不多,只是存在著形式上的差異。讀者可以將以上的例子用三種方法嘗試用三種方法實現。
總結一下call,apply,bind方法:
a:第一個參數都是指定函數內部中this的指向(函數執行時所在的作用域),然後根據指定的作用域,呼叫函數。
b:都可以在函數呼叫時傳遞參數。 call,bind方法需要直接傳入,而apply方法需要以陣列的形式傳入。
c:call,apply方法是在呼叫之後立即執行函數,而bind方法沒有立即執行,需要將函數再執行一遍。有點閉包的味道。
d:改變this物件的指向問題不只call,apply,bind方法,也可以使用that變數來固定this的指向。
以上是Javascript中call,apply,bind方法來源與聯繫區別實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!