call,apply,bind作為改變this指向的法寶,那么它們是怎么做到的呢,接下來嘗試邊分析、邊構造:
我們先來構造一個mycall骨架,把功能添加到原型鏈
讓函式依附于某個物件,并且以物件方法的方式執行,以此來改變this指向,需要注意:
-
為了避免不必要的覆寫,我們使用Symbol作為key,并且在執行完后洗掉這個key
-
要有return,不然原始函式的return無法暴露
原生的call可以傳null、undefined、字串等,我們這里也要兼容下,說下代碼風格:
-
null == undefined,但是分開寫更明確
-
!和==配合相比于!=,在直覺上更符合排除法的邏輯
這樣就算完成了,可以自行測驗,然后看看apply
apply和call的區別在于傳參,那么我們稍微改改mycall就可以了
apply也完成了,自行測驗哈,最后是bind,根據測驗:
-
bind連續呼叫的時候,引數依次傳入,但是只有第一次傳入的this會作用于原始函式
-
并且bind會回傳一個系結了this的函式,需要手動執行,那么我們試試
原理也很簡單,有沒有發現這是一個閉包哈哈
結尾了,為了避免一些小失誤,附一段完整版^_^

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/518770.html
標籤:其他
下一篇:超強的蘋果官網滾動文字特效實作
