call.apply.bind 走一個!

webfansplz發表於2019-03-05

前言

[實踐系列] 主要是讓我們通過實踐去加深對一些原理的理解。

實踐系列-前端路由

實踐系列-Babel原理

實踐系列-Promises/A+規範

實踐系列-瀏覽器快取機制

有興趣的同學可以關注 我的部落格 ,之後不斷會有乾貨更新哦。 求star求follow~

已經掌握該知識點的同學可以直接略過~

三兄弟的作用.

apply.call.bind 都是為了改變函式執行時上下文(this指向)而存在的。

image

三兄弟的區別.

  • 三兄弟接收的第一個引數都是 要繫結的this指向.
  • apply的第二個引數是一個引數陣列,call和bind的第二個及之後的引數作為函式實參按順序傳入。
  • bind不會立即呼叫,其他兩個會立即呼叫。

image

接下來,我們來對三兄弟進行模擬實現

call的簡易模擬實現(es6)

思路

  • 函式定義在哪裡 ?

call是可以被所有方法呼叫的,所以毫無疑問的定義在 Function的原型上!

  • 函式接收引數 ?

繫結函式被呼叫時只傳入第二個引數及之後的引數

  • 如何顯式繫結this ?

如果呼叫者函式,被某一個物件所擁有,那麼該函式在呼叫時,內部的this指向該物件。

ojbk..理清了思路.開擼

image

apply的簡易模擬實現(es6)

apply實現的思路與call基本相同,我們只需要對引數進行不同處理即可

image

bind的簡易模擬實現(es6)

這裡只是做簡易實現,不考慮new操作符的情況,之後會寫個文章對這個知識點進行詳解~

思路

  • 函式定義在哪裡 ?

bind是可以被所有方法呼叫的,所以毫無疑問的定義在 Function的原型上!

  • 函式接收引數 ?

bind函式返回一個繫結函式,最終呼叫需要傳入函式實參和繫結函式的實參!!

  • 如何顯式繫結this ?

如果呼叫者函式,被某一個物件所擁有,那麼該函式在呼叫時,內部的this指向該物件。

image

End

如果有幫助到你,請給我一個star,就算是對我的感謝啦~

相關文章