之前我們說的都是代碼 this 的默認(rèn)指向,今天我們要來說一下如何能改變 this 指向,也就是說, 你指向哪我不管, 我讓你指向哪, 你就得指向哪。
既然是在函數(shù)的原型上, 那么只要是函數(shù)就可以調(diào)用這三個方法,他們?nèi)齻€的作用就是改變函數(shù)的 this 指向
語法: 函數(shù).call( 函數(shù)內(nèi)的 this 指向, 給函數(shù)傳遞的參數(shù), 給函數(shù)傳遞的參數(shù) )
其實(shí) apply 本質(zhì)上和 call 方法沒有區(qū)別,只是給函數(shù)傳遞參數(shù)的方式不一樣 ,apply 的第二個參數(shù)是一個數(shù)組類的數(shù)據(jù)結(jié)構(gòu), 只要是按照索引排列即可
語法: 函數(shù).bind( 函數(shù)內(nèi)的 this 指向, 給函數(shù)傳遞的參數(shù), 給函數(shù)傳遞的參數(shù) )
其實(shí) bind 本質(zhì)上和 call 方法沒有區(qū)別,但是 bind 不會立即調(diào)用函數(shù),而是返回一個被鎖定好 this 的新函數(shù)
但是, 其實(shí)并不會立即執(zhí)行 fn 函數(shù),而是根據(jù) fn 函數(shù)復(fù)刻了一份一模一樣的函數(shù),新函數(shù)復(fù)制給了 res 變量,res 函數(shù)內(nèi)的 this 被鎖定為了 obj.
通過瀏覽器查看我們會發(fā)現(xiàn) fn 函數(shù)并沒有被調(diào)用,那是因?yàn)?bind 本身就不會調(diào)用 fn 函數(shù),如果想指向, 需要通過 res 變量調(diào)用
上面我們介紹了一下三個方法的用法,如果你能掌握好, 那么接下來就來看看這三個方法是如何實(shí)現(xiàn)的吧
這個其實(shí)和 call 方法是差不多的, 只是參數(shù)不一樣了而已,只是根據(jù)調(diào)用方式的不同, 我們接受參數(shù)不在需要 ...args, 直接接收即可
這個方法其實(shí)也是非常簡單,只要利用一下之前重構(gòu)好的 call 或者 apply 方法都可以