摘要:下面是函數(shù)的源碼這個(gè)函數(shù)有兩點(diǎn)比較重要的地方把返回的函數(shù)的屬性指向一個(gè)由匿名函數(shù)生成的對(duì)象,并且最終會(huì)執(zhí)行原來(lái)的那個(gè)函數(shù)的,也就是時(shí)的,這里我覺(jué)得是為了說(shuō)明返回的對(duì)象應(yīng)該是原函數(shù)的一個(gè)副本,區(qū)別只是綁定了和參數(shù)。
下面是bind函數(shù)的Polyfill源碼
if (!Function.prototype.bind) { Function.prototype.bind = function (oThis) { if (typeof this !== "function") { throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function () {}, fBound = function () { return fToBind.apply(this instanceof fNOP ? this : oThis || this, aArgs.concat(Array.prototype.slice.call(arguments))); }; fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; }; }
這個(gè)函數(shù)有兩點(diǎn)比較重要的地方
1.把bind返回的函數(shù)的prototyoe屬性指向一個(gè)由匿名函數(shù)生成的對(duì)象,并且最終會(huì)執(zhí)行原來(lái)的那個(gè)函數(shù)的prototype,也就是x.bind時(shí)的x,這里我覺(jué)得是為了說(shuō)明bind返回的對(duì)象應(yīng)該是原函數(shù)的一個(gè)副本,區(qū)別只是綁定了this和參數(shù)。
2.bind返回的匿名函數(shù)里的函數(shù)代碼,其中apply的第一個(gè)參數(shù)
(this instanceof fNOP && oThis )? this : oThis,直接執(zhí)行bind返回的函數(shù)時(shí),this instanceof fNOP返回false,所以apply的第一個(gè)參數(shù)是執(zhí)行bind的時(shí)候的第一個(gè)參數(shù),這也是平時(shí)我們的用法,但是如果是用new去執(zhí)行bind返回的函數(shù)時(shí),this instanceof fNOP返回的是true,這時(shí)候,如果在執(zhí)行bind的時(shí)候傳入了非空的值,那么這個(gè)值就會(huì)被新的this覆蓋,如果傳了空的值,那就把這個(gè)空值傳給apply。說(shuō)實(shí)話這里沒(méi)看出作者的用意。。。。
補(bǔ):this instanceof fNOP ? this : oThis || this這是另一個(gè)實(shí)現(xiàn)中的代碼,相比之前的,我覺(jué)得這個(gè)更準(zhǔn)確,這個(gè)說(shuō)的是如果是new調(diào)用的時(shí)候,直接把執(zhí)行bind時(shí)傳入的this覆蓋掉,這說(shuō)明new執(zhí)行時(shí)的this優(yōu)先級(jí)更高,如果是直接執(zhí)行而不是new調(diào)用時(shí),就先判斷執(zhí)行bind時(shí)有沒(méi)有傳入this,如果有就把他壓入x.bind中的x中執(zhí)行,如果沒(méi)有就傳入新的this。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81218.html
摘要:下邊是服務(wù)容器工作示意圖服務(wù)容器的產(chǎn)生框架中,服務(wù)容器是由中類完成的,該類實(shí)現(xiàn)了服務(wù)容器的核心功能。并不是框架中所有的類都能實(shí)現(xiàn)自動(dòng)依賴注入的功能只有服務(wù)容器創(chuàng)建的類實(shí)例才能實(shí)現(xiàn)依賴自動(dòng)注入。框架中的服務(wù)容器是全局的,不需要 1.服務(wù)容器 服務(wù)容器是Lumen框架整個(gè)系統(tǒng)功能調(diào)度配置的核心,它提供了整個(gè)框架運(yùn)行過(guò)程中的一系列服務(wù)。服務(wù)容器就是提供服務(wù)(服務(wù)可以理解為系統(tǒng)運(yùn)行中需要的東西...
摘要:音樂(lè)團(tuán)隊(duì)分享數(shù)據(jù)綁定運(yùn)行機(jī)制分析一個(gè)項(xiàng)目搞定所有主流架構(gòu)單元測(cè)試一個(gè)項(xiàng)目搞定所有主流架構(gòu)系列的第二個(gè)項(xiàng)目。代碼開(kāi)源,展示了的用法,以及如何使用進(jìn)行測(cè)試,還有用框架對(duì)的進(jìn)行單元測(cè)試。 Android 常用三方框架的學(xué)習(xí) Android 常用三方框架的學(xué)習(xí) likfe/eventbus3-intellij-plugin AS 最新可用 eventbus3 插件,歡迎品嘗 簡(jiǎn)單的 MVP 模...
摘要:服務(wù)容器的綁定綁定歡迎關(guān)注我的博客綁定是服務(wù)容器最常用的綁定方式,在上一篇文章中我們討論過(guò),的綁定有三種綁定自身綁定閉包綁定接口今天,我們這篇文章主要從源碼上講解服務(wù)容器是如何進(jìn)行綁定的。將閉包函數(shù)和單例變量存入數(shù)組中,以備解析時(shí)使用。 服務(wù)容器的綁定 bind 綁定 歡迎關(guān)注我的博客:www.leoyang90.cn bind 綁定是服務(wù)容器最常用的綁定方式,在 上一篇文章中我們討論...
摘要:寫文章不容易,點(diǎn)個(gè)贊唄兄弟專注源碼分享,文章分為白話版和源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊下面鏈接或者拉到下面關(guān)注公眾號(hào)也可以吧原理源碼版之屬性解析哈哈哈,今天終 寫文章不容易,點(diǎn)個(gè)贊唄兄弟 專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究...
閱讀 1212·2021-11-17 09:33
閱讀 3622·2021-09-28 09:42
閱讀 3352·2021-09-13 10:35
閱讀 2512·2021-09-06 15:00
閱讀 2455·2021-08-27 13:12
閱讀 3619·2021-07-26 23:38
閱讀 1863·2019-08-30 15:55
閱讀 549·2019-08-30 15:53