首頁 >web前端 >js教程 >Javascript中call,apply,bind方法來源與聯繫區別實例詳解

Javascript中call,apply,bind方法來源與聯繫區別實例詳解

伊谢尔伦
伊谢尔伦原創
2017-07-20 14:04:431553瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn