摘要:下面我們用一下方法來(lái)修改上面的例子我們看到通過(guò)方法就可以輸出了語(yǔ)法格式參數(shù)當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的指向。一個(gè)綁定函數(shù)也能使用操作符創(chuàng)建對(duì)象這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。
bind用法介紹:
bind()方法創(chuàng)建一個(gè)新的函數(shù), 當(dāng)被調(diào)用時(shí),將其this關(guān)鍵字設(shè)置為提供的值,在調(diào)用新函數(shù)時(shí),在任何提供之前提供一個(gè)給定的參數(shù)序列。
這段是來(lái)自MDN:bind的介紹,我們可以理解bind方法返回一個(gè)新的函數(shù),這個(gè)函數(shù)內(nèi)部的this指向提供的參數(shù)值,來(lái)看個(gè)例子
const person = { age: 20, getAge() { return this.age } } const getAge = person.getAge console.log(getAge()) // output :undefined
上面代碼輸出了undefined,什么原因呢?相信大家都知道,getAge()執(zhí)行時(shí)內(nèi)部的this指向了window,而window并沒(méi)有age這個(gè)屬性,我們并沒(méi)有定義全局的age變量,那我們?cè)趺唇鉀Q這個(gè)問(wèn)題呢?那就是用哪個(gè)bind方法,需要注意的是bind方法的兼容性,IE9以上包括IE9。其他現(xiàn)代瀏覽器不用說(shuō)肯定是支持的。下面我們用一下bind方法來(lái)修改上面的例子
const person = { age: 20, getAge() { return this.age } } const getAge = person.getAge.bind(person) console.log(getAge()) // output :20
我們看到通過(guò)bind方法就可以輸出age了
bind語(yǔ)法格式fun.bind(thisArg[, arg1[, arg2[, ...]]])參數(shù)
thisArg
當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的 this 指向。當(dāng)使用new 操作符調(diào)用綁定函數(shù)時(shí),該參數(shù)無(wú)效。
arg1, arg2, ...
當(dāng)綁定函數(shù)被調(diào)用時(shí),這些參數(shù)將置于實(shí)參之前傳遞給被綁定的方法返回值
返回由指定的this值和初始化參數(shù)改造的原函數(shù)拷貝
個(gè)人理解:bind方法接受的第一個(gè)參數(shù)是你想綁定的this值,通常是個(gè)對(duì)象,這個(gè)對(duì)象在函數(shù)內(nèi)部用this可以獲取到,第一個(gè)參數(shù)后面可以跟若干個(gè)參數(shù),這些參數(shù)可以在bind的時(shí)候傳遞,相當(dāng)于預(yù)設(shè)參數(shù)。
好了,知道用法和參數(shù)后我們就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)陋版的了
Function.prototype.bind=function (context) { if(typeof this !=="function"){ throw new Error(`${this.name} is not a function`) } const srcFun=this// 保存原始函數(shù) const arg=Array.prototype.slice.call(arguments,1)// 把a(bǔ)rguments類(lèi)數(shù)組轉(zhuǎn)為真實(shí)數(shù)組 let noop=function(){} const fBound= function () { if(this instanceof noop){ context=this } // 合并新舊參數(shù) return srcFun.apply(context,arg.concat(Array.prototype.slice.call(arguments,0))) } if(this.prototype){ noop.prototype=this.prototype//維護(hù)原型關(guān)系,指向原始函數(shù) } fBound.prototype=new noop()//新函數(shù)的prototype的__proto__指向noop.prototype return fBound }
很簡(jiǎn)陋,沒(méi)有嚴(yán)謹(jǐn)?shù)呐袛唷?/p>
一個(gè)綁定函數(shù)也能使用new操作符創(chuàng)建對(duì)象:這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。提供的 this 值被忽略,同時(shí)調(diào)用時(shí)的參數(shù)被提供給模擬函數(shù)。
上面是MDN的一段話,也就是bind返回的函數(shù)也可以當(dāng)做構(gòu)造函數(shù)來(lái)用,此時(shí)bind傳遞的第一個(gè)參數(shù)無(wú)效,但是其他參數(shù)有效。
那么要做判斷處理就是
//代碼2 if(this instanceof noop){ context=this }
這段代碼就可以區(qū)分出是在把函數(shù)當(dāng)做構(gòu)造函數(shù)來(lái)new了還是當(dāng)做普通方法來(lái)調(diào)用了,我們知道
當(dāng)new 的時(shí)候?qū)嶋H做了這點(diǎn)事
var obj={} obj._proto_=構(gòu)造函數(shù)的prototype 構(gòu)造函數(shù).call(obj)
所以現(xiàn)在在代碼2中的this是構(gòu)造函數(shù)的實(shí)例,那就得更改bind后的函數(shù),讓bind后的fBound函數(shù)的prototype指向noop的實(shí)例,這樣此時(shí)的this就借助noop實(shí)例指向了noop的原型,那么this instanceof noop就是true了
總結(jié)上面是我對(duì)bind方法的一些理解和實(shí)現(xiàn),僅供參考和學(xué)習(xí)。bind方法在react中會(huì)比較常用到,有些面試題也會(huì)讓自己實(shí)現(xiàn)一個(gè),所以嘗試一下也能學(xué)到不少東西了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/95473.html
摘要:方法創(chuàng)建一個(gè)新的函數(shù)當(dāng)被調(diào)用時(shí),它的關(guān)鍵字被設(shè)置為提供的值。語(yǔ)法簡(jiǎn)單地看一下這些參數(shù)的含義當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的指向當(dāng)使用操作符調(diào)用綁定函數(shù)時(shí),該參數(shù)無(wú)效。結(jié)尾文章很簡(jiǎn)短,知道怎么實(shí)現(xiàn)一個(gè)原生的就行。 前言 這是underscore.js源碼分析的第五篇,如果你對(duì)這個(gè)系列感興趣,歡迎點(diǎn)擊 underscore-analysis/ watch一下,隨時(shí)可以看到動(dòng)態(tài)...
摘要:方法創(chuàng)建一個(gè)新的函數(shù)當(dāng)被調(diào)用時(shí),它的關(guān)鍵字被設(shè)置為提供的值。語(yǔ)法簡(jiǎn)單地看一下這些參數(shù)的含義當(dāng)綁定函數(shù)被調(diào)用時(shí),該參數(shù)會(huì)作為原函數(shù)運(yùn)行時(shí)的指向當(dāng)使用操作符調(diào)用綁定函數(shù)時(shí),該參數(shù)無(wú)效。結(jié)尾文章很簡(jiǎn)短,知道怎么實(shí)現(xiàn)一個(gè)原生的就行。 前言 這是underscore.js源碼分析的第五篇,如果你對(duì)這個(gè)系列感興趣,歡迎點(diǎn)擊 underscore-analysis/ watch一下,隨時(shí)可以看到動(dòng)態(tài)...
徹底弄清 this call apply bind 以及原生實(shí)現(xiàn) 有關(guān) JS 中的 this、call、apply 和 bind 的概念網(wǎng)絡(luò)上已經(jīng)有很多文章講解了 這篇文章目的是梳理一下這幾個(gè)概念的知識(shí)點(diǎn)以及闡述如何用原生 JS 去實(shí)現(xiàn)這幾個(gè)功能 this 指向問(wèn)題 this this 的指向在嚴(yán)格模式和非嚴(yán)格模式下有所不同;this 究竟指向什么是,在絕大多數(shù)情況下取決于函數(shù)如何被調(diào)用 全局執(zhí)行...
摘要:當(dāng)多個(gè)事件觸發(fā)的時(shí)候,會(huì)把異步事件依次的放入里等同步事件執(zhí)行完之后,再去隊(duì)列里一個(gè)個(gè)執(zhí)行拾遺常用方法總結(jié)面試的信心來(lái)源于過(guò)硬的基礎(chǔ)參考高級(jí)程序設(shè)計(jì)你所不知道的深入淺出知識(shí)點(diǎn)思維導(dǎo)圖經(jīng)典實(shí)例總結(jié)那些剪不斷理還亂的關(guān)系 持續(xù)不斷更新。。。 基本類(lèi)型和引用類(lèi)型 vue props | Primitive vs Reference Types 基本類(lèi)型和字面值之間的區(qū)別 基本類(lèi)型和字面值相等,...
閱讀 1861·2021-11-15 11:39
閱讀 1226·2021-10-18 13:29
閱讀 1188·2021-08-31 09:42
閱讀 2741·2019-08-30 11:11
閱讀 2117·2019-08-26 12:12
閱讀 2116·2019-08-26 10:17
閱讀 3391·2019-08-23 18:38
閱讀 3228·2019-08-23 18:38