JS前端面試手寫apply和bind實(shí)例
前言
面試官問:“聊一聊你理解的 apply 和 bind。”
于是我便開始開始介紹起這兩個(gè)知識(shí)點(diǎn),最后順帶提了它們的實(shí)現(xiàn)代碼。
這不提倒還好,一提就出了大事,一下子給面試官找到了面試題目。
面試官緊接著說:“既然你提到了代碼,那就手寫一下它倆吧。”
我一下子不知所措。雖然我了解過 apply 和 bind 手寫代碼,但是現(xiàn)在讓我立馬手寫出來它們,實(shí)屬有些困難。
不過最后還是硬著頭皮寫了一下,但是結(jié)果不盡人意。
apply && bind
函數(shù) apply 和 bind 在日常開發(fā)中經(jīng)常會(huì)被用到,理解它們的作用以及邏輯至關(guān)重要。所以今天我們來探討一下它們的實(shí)現(xiàn)邏輯,并對(duì)它們進(jìn)行手寫,來學(xué)會(huì)如何輕松手寫它們。
apply && bind 作用
知己知彼,方能百戰(zhàn)百勝。在進(jìn)行手寫之前,我們先來簡(jiǎn)單聊一下它們。 眾所周知,apply 和 bind 作用是改變函數(shù)的調(diào)用對(duì)象。很多人對(duì)這個(gè)不是很理解,什么是函數(shù)的調(diào)用對(duì)象呢?其實(shí)簡(jiǎn)單點(diǎn)理解就是改變函數(shù)的 this 對(duì)象指向。因?yàn)檫@時(shí)候 this 在函數(shù)就充當(dāng)了一個(gè)調(diào)用的作用,而 apply 和 bind 就是有著改變 this 指向的作用。
apply 的其他作用,是改變對(duì)象的執(zhí)行上下文,并且是立即執(zhí)行的。 bind 也能改變對(duì)象的執(zhí)行上下文。
相同點(diǎn) VS 不同點(diǎn)
它們的相同點(diǎn)在于都可以改變 this 的指向,并且傳入的第一個(gè)參數(shù)都是綁定的 this,不同點(diǎn)在于 bind 返回的是一個(gè)改變了 this 指向的函數(shù),便于稍后調(diào)用,而 apply 會(huì)立即調(diào)用。另外 apply 是一次性傳入?yún)?shù),而 bind 可以分為多次傳入。
輕松手寫
有了理論基礎(chǔ),我們可以開始手寫部分了。
手寫實(shí)現(xiàn) apply
我們先來看 apply,apply 手寫實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,大致思路如下:
首先用 typeof 來檢查調(diào)用 apply 的對(duì)象是否為函數(shù),如果不是則拋出錯(cuò)誤。然后將函數(shù)作為傳入的 context 對(duì)象的一個(gè)屬性,并調(diào)用該函數(shù)。 最后調(diào)用之后通過 delete 刪除該屬性,避免對(duì)傳入對(duì)象造成污染。context 代表上下文對(duì)象。
代碼如下:
Function.prototype.apply = function (context, args) {
if (typeof this !== 'function') {
console.log('not a function')
}
const fn = Symbol()
context[fn] = this
context[fn](...args)
delete context[fn]
}
這里使用到了新的 Symbol 數(shù)據(jù)類型,主要是避免在把函數(shù)賦值給 context 對(duì)象的時(shí)候,因?yàn)閷傩悦麤_突而覆蓋掉原有屬性。
手寫實(shí)現(xiàn) bind
相比較與 apply 手寫,我個(gè)人覺得 bind 手寫會(huì)相對(duì)復(fù)雜一些。bind 手寫實(shí)現(xiàn)思路如下:
和之前一樣,首先判斷調(diào)用對(duì)象是否為函數(shù),然后獲取其余傳入?yún)?shù)值,并創(chuàng)建一個(gè)函數(shù)返回。最后根據(jù)調(diào)用方式,傳入不同的綁定值。
函數(shù)內(nèi)部使用 apply 來綁定函數(shù)調(diào)用,需要判斷函數(shù)作為構(gòu)造函數(shù)的情況,這個(gè)時(shí)候需要傳入當(dāng)前函數(shù)的 this 給 apply 調(diào)用,其余情況都傳入指定的上下文對(duì)象 context。
代碼如下:
Function.prototype.myBind = function(context) {
if (typeof this !== "function") {
console.log("Error");
}
let args = [...arguments].slice(1),
fn = this;
return function Fn() {
return fn.apply(
this instanceof Fn ? this : context,
args.concat(...arguments)
);
};
};
總結(jié)
關(guān)于它們的手寫就到這里了,相信下次再面對(duì)同樣的問題時(shí)處理起來就能游刃有余了。這兩個(gè)手寫各有各的特點(diǎn),我個(gè)人建議可以多寫寫 bind 的手寫,我覺得它會(huì)比 apply 出錯(cuò)率更高。
雖然文章中是以手寫 apply 和 bind 為主,但是并不缺少 js 相關(guān)知識(shí)點(diǎn),比如 this 指向問題,總之,js 很重要,既是基礎(chǔ)又是重點(diǎn)。
以上就是手寫apply和bind實(shí)例的輕松實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于apply bind手寫實(shí)例的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
微信小程序 網(wǎng)絡(luò)API發(fā)起請(qǐng)求詳解
這篇文章主要介紹了微信小程序 網(wǎng)絡(luò)API發(fā)起請(qǐng)求詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11
js?交互在Flutter?中使用?webview_flutter
這篇文章主要為大家介紹了js?交互在Flutter?中使用?webview_flutter示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
JavaScript?與?TypeScript之間的聯(lián)系
這篇文章主要介紹了?JavaScript?與?TypeScript之間的聯(lián)系,JavaScript,也稱為?JS,是一種符合?ECMAScript?規(guī)范的編程語(yǔ)言。這是一個(gè)高級(jí)別的、通常是即時(shí)編譯的、多范式的。TypeScript?是一種強(qiáng)類型、面向?qū)ο蟮木幾g語(yǔ)言,更多消息內(nèi)容,需要的朋友可以參考一下下面文章內(nèi)容2021-11-11
精確到按鈕級(jí)別前端權(quán)限管理實(shí)現(xiàn)方案
這篇文章主要為大家介紹了精確到按鈕級(jí)別前端權(quán)限管理實(shí)現(xiàn)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
直觀詳細(xì)的typescript隱式類型轉(zhuǎn)換圖文詳解
這篇文章主要為大家介紹了直觀詳細(xì)的typescript隱式類型轉(zhuǎn)換圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
利用前端HTML+CSS+JS開發(fā)簡(jiǎn)單的TODOLIST功能(記事本)
這篇文章主要介紹了用HTML+CSS+JS做出簡(jiǎn)單的TODOLIST(記事本)項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-04-04
微信小程序中的onLoad詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了微信小程序中的onLoad詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04
微信小程序 監(jiān)聽手勢(shì)滑動(dòng)切換頁(yè)面實(shí)例詳解
這篇文章主要介紹了微信小程序 監(jiān)聽手勢(shì)滑動(dòng)切換頁(yè)面實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
微信小程序 中wx.chooseAddress(OBJECT)實(shí)例詳解
這篇文章主要介紹了微信小程序 中wx.chooseAddress(OBJECT)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
實(shí)現(xiàn)一個(gè)簡(jiǎn)單得數(shù)據(jù)響應(yīng)系統(tǒng)
這篇文章主要介紹了實(shí)現(xiàn)一個(gè)簡(jiǎn)單得數(shù)據(jù)響應(yīng)系統(tǒng),文章介紹的數(shù)據(jù)響應(yīng)系統(tǒng)會(huì)用到Dep,其實(shí),這就是一個(gè)依賴收集的容器, depend 收集依賴, notify 觸發(fā)依賴,下面來看看詳細(xì)的內(nèi)容結(jié)介紹,需要的朋友可以參考一下2021-11-11

