亚洲av午夜福利精品一区人妖,亚洲乱码日产精品a级毛片久久,91精品视频观看,青草青草久热精品视频在线观看

call、apply、bind 原理實現(xiàn)

2020-4-6    seo達(dá)人

目錄

  1. call 的模擬實現(xiàn)
  2. apply 的模擬實現(xiàn)
  3. bind 的模擬實現(xiàn)
  4. 三者異同



    學(xué)習(xí)并參考于:



    JavaScript深入之call和apply的模擬實現(xiàn)



    JS的call,apply與bind詳解,及其模擬實現(xiàn)





    (一)call的模擬實現(xiàn)

    call 用法 : MDN Function.prototype.call()



    call() 方法使用一個指定的 this 值和可選的參數(shù)列表來調(diào)用一個函數(shù)。



    call() 提供新的 this 值給當(dāng)前調(diào)用的函數(shù)/方法。


  5. call 實現(xiàn)主要思路:

    將函數(shù)設(shè)為對象的屬性



    執(zhí)行該函數(shù)



    刪除該函數(shù)



    另外還有考慮:



    call 函數(shù)還能給定參數(shù)執(zhí)行函數(shù)

    this 參數(shù)不傳,或者傳null,undefined, this指向window對象

    函數(shù)是可以有返回值的
  6. 實現(xiàn):

    Function.prototype.myCall = function () {

      if (typeof this !== 'function') {

        throw new TypeError('error!')

      }

      let context = arguments[0] || window   //this 參數(shù)可以傳 null,當(dāng)為 null 的時候,視為指向 window

      context.fn = this  // 首先要獲取調(diào)用call的函數(shù),用this可以獲取

      let args = [...arguments].slice(1) //從 Arguments 對象中取值,取出第二個到最后一個參數(shù)   

      let result = context.fn(...args)  //函數(shù)是可以有返回值的

      delete context.fn

      return result

    }


  7. 測試:

    // 測試一下上面實現(xiàn)的myCall

    var value = 2;



    var obj = {

        value: 1

    }



    function bar(name, age) {

        console.log(this.value);

        return {

            value: this.value,

            name: name,

            age: age

        }

    }



    bar.call(null); // 2



    console.log(bar.myCall(obj, 'kevin', 18));

    // 1

    // Object {

    //    value: 1,

    //    name: 'kevin',

    //    age: 18

    // }



    (二)apply 的模擬實現(xiàn)

    apply 用法:MDN Function.prototype.apply()



    apply() 方法使用一個指定的 this 值和可選的參數(shù)數(shù)組 來調(diào)用一個函數(shù)。



    apply 的實現(xiàn)跟 call 類似。


  8. 實現(xiàn):

    Function.prototype.myApply = function () {

      if (typeof this !== 'function') {

        throw new TypeError('error!')

      }

      let context = arguments[0] || window

      context.fn = this

      let result = arguments[1] ? context.fn(...arguments[1]) : context.fn()

      delete context.fn

      return result

    }


  9. 測試:

    var foo = {

        value: 1

    }

    function bar(name, age) {

        console.log(name)

        console.log(age)

        console.log(this.value);

    }

    bar.myApply(foo, ['black', '18']) // black 18 1



    (三)bind 的模擬實現(xiàn)

    bind 用法:MDN Function.prototype.bind()



    bind()方法會創(chuàng)建一個新函數(shù),稱為綁定函數(shù)。當(dāng)這個新函數(shù)被調(diào)用時,bind() 的第一個參數(shù)將作為它運(yùn)行時的 this,之后的一序列參數(shù)將會在傳遞的實參前傳入作為它的參數(shù)。



    bind是ES5新增的一個方法,不會執(zhí)行對應(yīng)的函數(shù),而是返回對綁定函數(shù)的引用。


  10. 實現(xiàn):

    Function.prototype.customBind = function () {

      if (typeof this !== 'function') {

        throw new TypeError('error!')

      }

      const that = this   // 首先要獲取調(diào)用bind的函數(shù),用this獲取并存放在that中

      let context = arguments[0] || window

      const args = [...arguments].slice(1)

      return function() {

        return that.apply(context, args.concat([...arguments]))

      }

    }



    (四)三者異同
  11. 相同:

    改變函數(shù)體內(nèi) this 的指向
  12. 不同:

    call、apply的區(qū)別:call方法接受的是參數(shù)列表,而apply方法接受的是一個參數(shù)數(shù)組。

    bind不立即執(zhí)行。而call或apply會自動執(zhí)行對應(yīng)的函數(shù)。


日歷

鏈接

個人資料

存檔

亚洲av午夜福利精品一区人妖,亚洲乱码日产精品a级毛片久久,91精品视频观看,青草青草久热精品视频在线观看
<strike id="cy2gs"><menu id="cy2gs"></menu></strike>
  • <del id="cy2gs"><dfn id="cy2gs"></dfn></del>
  • 久久av一区二区| 国产在线拍揄自揄视频不卡99| 亚洲综合久久久久| 日韩亚洲不卡在线| 亚洲毛片播放| 99热免费精品| 一区二区三区日韩精品视频| 亚洲伦伦在线| 亚洲最新中文字幕| 一区二区三区久久久| 这里只有精品视频在线| 国产精品99久久久久久www| a91a精品视频在线观看| 在线综合亚洲| 亚洲欧美日韩精品在线| 久久国产精彩视频| 鲁大师影院一区二区三区| 女生裸体视频一区二区三区| 欧美精品aa| 国产精品久久综合| 国产一区 二区 三区一级| 精品成人一区二区三区| 在线日韩日本国产亚洲| 亚洲欧洲精品成人久久奇米网| 亚洲三级国产| 亚洲一区在线免费观看| 欧美在线观看www| 老司机午夜免费精品视频| 欧美极品影院| 国产精品美女久久久免费| 狠狠综合久久av一区二区小说| 亚洲国产成人一区| 9国产精品视频| 欧美一级午夜免费电影| 免费成人高清视频| 国产精品国产精品| 在线成人激情| 亚洲性感激情| 鲁大师影院一区二区三区| 欧美日韩免费| 国产一区二区成人| 亚洲人成网站色ww在线| 亚洲欧美精品在线观看| 六月婷婷一区| 国产精品夜色7777狼人| 亚洲国产婷婷香蕉久久久久久99 | 亚洲手机在线| 久久精品国产亚洲高清剧情介绍| 免费观看欧美在线视频的网站| 欧美日韩专区在线| 一区在线免费观看| 亚洲性感美女99在线| 久久午夜精品一区二区| 欧美午夜免费电影| 在线观看欧美日韩国产| 亚洲一级片在线观看| 麻豆av一区二区三区| 国产精品欧美日韩一区二区| 亚洲国产日韩精品| 欧美中文在线免费| 欧美区视频在线观看| 国产有码一区二区| 亚洲私人黄色宅男| 你懂的网址国产 欧美| 国产欧美高清| 一本一本久久a久久精品综合妖精| 欧美在线观看一二区| 欧美日韩精品欧美日韩精品一 | 欧美日韩精品一区视频| 国产一区二区三区在线观看视频 | 欧美三日本三级少妇三2023 | 99精品国产在热久久婷婷| 久久久久久久网站| 国产精品丝袜久久久久久app| 亚洲人在线视频| 久久精品视频va| 国产精品视频成人| 一区二区国产在线观看| 免费久久精品视频| 国产亚洲va综合人人澡精品| 一本到12不卡视频在线dvd| 美女性感视频久久久| 国产亚洲午夜高清国产拍精品| 宅男精品视频| 欧美紧缚bdsm在线视频| 亚洲第一二三四五区| 欧美在线视频不卡| 国产精品国内视频| 99re66热这里只有精品3直播| 欧美 日韩 国产在线| 加勒比av一区二区| 久久精品国产综合| 国产一级一区二区| 欧美影院精品一区| 国产精品一区二区三区乱码| 亚洲五月六月| 欧美三级视频| 99国产精品视频免费观看一公开| 欧美 日韩 国产 一区| 在线观看亚洲专区| 久久久久国产一区二区| 国产亚洲欧洲一区高清在线观看| 午夜精品999| 欧美三级中文字幕在线观看| 亚洲美女精品一区| 欧美激情欧美狂野欧美精品 | 一区二区高清视频| 欧美精品在线一区二区三区| 91久久视频| 欧美成人性生活| 在线精品视频一区二区| 久久久久久久久久久久久女国产乱| 国产视频精品免费播放| 欧美亚洲自偷自偷| 国产视频一区在线观看| 久久国产毛片| 激情欧美一区| 蜜臀av一级做a爰片久久| 在线观看亚洲精品| 欧美成人免费全部| 亚洲精品国产精品国自产观看浪潮 | 99精品欧美一区二区三区综合在线| 欧美精品久久久久久久| 亚洲精品国产欧美| 欧美日韩成人一区二区| 99re这里只有精品6| 欧美日韩天堂| 亚洲一区3d动漫同人无遮挡| 国产精品卡一卡二卡三| 欧美夜福利tv在线| 国内揄拍国内精品少妇国语| 久久免费高清视频| 最新亚洲一区| 欧美偷拍另类| 欧美在线黄色| 亚洲成色777777女色窝| 欧美经典一区二区三区| 一区二区三区免费观看| 国产精品毛片a∨一区二区三区| 欧美一区二区三区免费视| 国内一区二区在线视频观看| 欧美成人69| 一片黄亚洲嫩模| 国产视频不卡| 免费成人网www| 9色porny自拍视频一区二区| 国产精品美女主播| 久久精品亚洲国产奇米99| 亚洲丰满在线| 国产精品国产三级国产a| 久久久久免费观看| 99视频有精品| 国产日韩精品一区二区| 奶水喷射视频一区| 中文日韩电影网站| 国产欧美日韩三级| 欧美激情按摩在线| 午夜在线播放视频欧美| 亚洲激情成人网| 欧美性片在线观看| 久久精品国产一区二区三区免费看| 亚洲国产mv| 国产精品高潮呻吟| 麻豆精品一区二区av白丝在线| 99视频精品全国免费| 国产亚洲欧美激情| 欧美日韩大陆在线| 久久国产精品网站| 夜夜夜精品看看| 在线激情影院一区| 国产精品热久久久久夜色精品三区| 久久亚洲国产精品日日av夜夜| 99精品免费| 在线成人免费观看| 国产精品国产三级欧美二区 | 在线一区二区日韩| 激情欧美一区二区三区| 国产精品久久久久久久久借妻| 麻豆国产精品777777在线| 亚洲一区中文| 亚洲国产欧美一区| 国产日产高清欧美一区二区三区| 欧美精品97| 久久久久成人精品免费播放动漫| 日韩一级免费观看| 黄色成人av网| 国产精品中文字幕欧美| 欧美日本精品在线| 久久综合网hezyo| 性久久久久久| 亚洲视频免费在线观看| 亚洲国产免费| 激情成人在线视频| 国产日韩av高清| 国产精品sm| 欧美精品久久99| 老司机午夜精品| 久久久久久久高潮| 午夜亚洲激情| 亚洲免费在线观看|