淺談用原生 js 實現函數的 bind 方法

來源:互聯網
上載者:User

標籤:https   修改   javascrip   cti   列印   call   指定   context   問題   

bind的作用是讓目標函數執行時候的 this 改為指定的上下文。

一般情況下,this 取決於調用者,誰調用函數 this 就是誰(自執行函數、定時器……之類的特殊情況除外)。

有那麼一句話,在 JavaScript 中,萬物皆對象。
 1 var want = function want() { 2     console.log(this); 3 } 4  5 var good = function good() { 6     console.log(‘https://www.cnblogs.com/xwant‘) 7 } 8  9 good.go = want;10 11 good.go();12 13 // 控制台列印出good這個函數

函數也是一個對象,以對象調用函數的方式執行這個函數,這個函數的指向就變為了這個調用者。

那麼現在將這個方式封裝成一個方法。

1 Function.prototype._bind = function _bind(context) {2      if(typeof context === ‘function‘) return this;3      context.fuc = this;
4 return function () {5 context.fuc(...arguments)6 }7 };

在這裡利用 JavaScript 的這個特性,將這個函數,寫到了指定內容相關的一個屬性下。

由於直接返回 context.fun 的話,返回的其實是 context.fun 代表的這個函數體。

所以在調用這個方法的時候,方法中 this 還是指向的 window ,於是這裡套用了一個匿名函數來解決這個問題。

由於不知道要修改 this 的函數是否有形參,所以在執行的時候把匿名函數中的 arguments 拉下來,在函數執行時,將 arguments 以 ES6 的新特性解構賦值的方式傳進去,由此,函數的參數問題也解決了(只測試了簡單的傳參沒有深入測試)。

當然,這裡只論方法暫且就不說效能方面的問題。

通過 .call 或者 .apply 的方式也可以實現 bind 方法,這裡不多討論。

把上面的代碼改巴改巴, .call 和 .apply 也就實現了。

文章可能存在思路或者理解上的偏差,如果各路高手有意見或建議,還望指點一二。

淺談用原生 js 實現函數的 bind 方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.