自己實(shí)現(xiàn)一個(gè)apply方法

? ? 我們要自己實(shí)現(xiàn)一個(gè)apply方法,我覺得最終的代碼并不重要,關(guān)鍵是實(shí)現(xiàn)這個(gè)方法的思路,掌握了思路,才算是學(xué)到了真正的知識(shí),并能夠把這種思考方式用到其他地方。

1.apply方法是什么

? ? apply是js中函數(shù)的自帶方法,可以在指定函數(shù)this指向的情況下,執(zhí)行函數(shù),并傳遞參數(shù)

2.方法應(yīng)該放在哪?接收那些參數(shù)?

Function.prototype

? ? 由上面的分析可知,apply屬于的自帶方法,js中的每個(gè)函數(shù)都可以執(zhí)行此方法,因此這個(gè)方法,應(yīng)該是綁定到Function構(gòu)造函數(shù)的原型上。apply方法可以接收兩個(gè)參數(shù),第一個(gè)參數(shù)是this的指向?qū)ο螅硗庖粋€(gè)參數(shù)就是函數(shù)執(zhí)行時(shí),接收的參數(shù)。由此分析,我們可以得到如下的代碼

arguments

????可以看到代碼中出現(xiàn)了arguments變量,這個(gè)不做過多解釋,可以網(wǎng)上搜一搜。在這里想說的是要熟悉這個(gè)用法,因?yàn)楹芏鄷r(shí)候我們寫的函數(shù),不能確定在函數(shù)執(zhí)行的時(shí)候,最終會(huì)接收多少個(gè)參數(shù),這個(gè)時(shí)候用arguments就可以在編寫函數(shù)的內(nèi)部代碼時(shí),提前拿到將來函數(shù)執(zhí)行時(shí),可能會(huì)被傳入的所有參數(shù),做相應(yīng)處理

3.如何決定this的指向

? ? 我們知道this的指向是在函數(shù)執(zhí)行的時(shí)候才決定的,具體指向簡(jiǎn)單來說就是這個(gè)函數(shù)是由哪個(gè)對(duì)象來調(diào)用的,執(zhí)行時(shí)函數(shù)內(nèi)部的this就指向這個(gè)對(duì)象。比如obj.fn(),fn函數(shù)是通過obj對(duì)象來調(diào)用的,fn函數(shù)執(zhí)行時(shí),this就指向obj對(duì)象。因此可以想到,如果想決定一個(gè)函數(shù)的this指向,那就要把這個(gè)函數(shù)變?yōu)樵搶?duì)象的方法,然后通過對(duì)象來調(diào)用這個(gè)函數(shù),因此我們可以得到如下代碼


?這里面還有個(gè)細(xì)節(jié),就是為什么直接讓fn(fn是隨便起的函數(shù)名,最后會(huì)被刪掉。關(guān)鍵是這個(gè)fn屬于context對(duì)象的方法,通過context來調(diào)用fn)等于this。這其實(shí)是涉及到構(gòu)造函數(shù)和原型的知識(shí)了,簡(jiǎn)單說下,我們知道用new關(guān)鍵字執(zhí)行構(gòu)造函數(shù),可以得到一個(gè)實(shí)例對(duì)象,那么在編寫構(gòu)造函數(shù)代碼的時(shí)候,總得有個(gè)方法能夠拿到那個(gè)還未出現(xiàn)的未來的實(shí)例對(duì)象吧,這樣我們才能對(duì)實(shí)例對(duì)象進(jìn)行一些屬性和方法的添加,而這個(gè)方法,就是this,也就是說構(gòu)造函數(shù)內(nèi)部的this,就指向未來的實(shí)例對(duì)象。那構(gòu)造函數(shù)上的原型對(duì)象,也是同理,原型對(duì)象中的方法,也是需要能夠拿到未來的實(shí)例的,那同樣也是通過this拿到。回到上面的代碼,函數(shù)本質(zhì)上也是對(duì)象(js中其實(shí)一切皆對(duì)象),函數(shù)的構(gòu)造函數(shù)是Function,我們寫的Function.prototype.apply2方法,即是原型對(duì)象中的方法,那么在apply2內(nèi)部,this指向的就是未來的那個(gè)執(zhí)行函數(shù),我們?cè)趯W(xué)習(xí)原型這塊知識(shí)的時(shí)候,對(duì)于this的使用可能簡(jiǎn)單了解一下就略過了,沒有想到真正的用法是這樣的(反正我是沒想到)

4.如何把數(shù)量不固定的參數(shù)傳遞給一個(gè)函數(shù),并執(zhí)行這個(gè)函數(shù)

這里就需要用到eval函數(shù)。eval函數(shù)計(jì)算 JavaScript 字符串,并把它作為腳本代碼來執(zhí)行。我們可以打印一下把數(shù)組轉(zhuǎn)換為字符串之后的結(jié)果,會(huì)發(fā)現(xiàn)打印結(jié)果就是把數(shù)組的中括號(hào)去掉后的元素的字符串,元素之間還是用逗號(hào)連接,這種形式恰好就是函數(shù)執(zhí)行時(shí),實(shí)參的傳遞形式。因此我們可以得到最終版的代碼


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容