成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

bind源碼解析

tianyu / 613人閱讀

摘要:下面是函數(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

相關(guān)文章

  • Lumen框架“服務(wù)容器”源碼解析

    摘要:下邊是服務(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)行中需要的東西...

    ytwman 評(píng)論0 收藏0
  • Android開(kāi)源架構(gòu)

    摘要:音樂(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 模...

    sutaking 評(píng)論0 收藏0
  • Laravel核心——Ioc服務(wù)容器源碼解析(服務(wù)器綁定)

    摘要:服務(wù)容器的綁定綁定歡迎關(guān)注我的博客綁定是服務(wù)容器最常用的綁定方式,在上一篇文章中我們討論過(guò),的綁定有三種綁定自身綁定閉包綁定接口今天,我們這篇文章主要從源碼上講解服務(wù)容器是如何進(jìn)行綁定的。將閉包函數(shù)和單例變量存入數(shù)組中,以備解析時(shí)使用。 服務(wù)容器的綁定 bind 綁定 歡迎關(guān)注我的博客:www.leoyang90.cn bind 綁定是服務(wù)容器最常用的綁定方式,在 上一篇文章中我們討論...

    imtianx 評(píng)論0 收藏0
  • 【Vue原理】Compile - 源碼版 之 Parse 屬性解析

    摘要:寫文章不容易,點(diǎn)個(gè)贊唄兄弟專注源碼分享,文章分為白話版和源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊下面鏈接或者拉到下面關(guān)注公眾號(hào)也可以吧原理源碼版之屬性解析哈哈哈,今天終 寫文章不容易,點(diǎn)個(gè)贊唄兄弟 專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究...

    tinna 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<