国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

如何使用50行javaScript代碼實(shí)現(xiàn)簡(jiǎn)單版的call,apply,bind

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:52:29
文檔

如何使用50行javaScript代碼實(shí)現(xiàn)簡(jiǎn)單版的call,apply,bind

如何使用50行javaScript代碼實(shí)現(xiàn)簡(jiǎn)單版的call,apply,bind:在實(shí)現(xiàn)自己的call,apply,bind前,需要復(fù)習(xí)一下this. 所謂的this其實(shí)可以理解成一根指針: 其實(shí) this 的指向,始終堅(jiān)持一個(gè)原理:this 永遠(yuǎn)指向最后調(diào)用它的那個(gè)對(duì)象,這就是精髓。最關(guān)鍵所在 this的四種指向: 當(dāng)this所在的函數(shù)被普通調(diào)用時(shí),指向w
推薦度:
導(dǎo)讀如何使用50行javaScript代碼實(shí)現(xiàn)簡(jiǎn)單版的call,apply,bind:在實(shí)現(xiàn)自己的call,apply,bind前,需要復(fù)習(xí)一下this. 所謂的this其實(shí)可以理解成一根指針: 其實(shí) this 的指向,始終堅(jiān)持一個(gè)原理:this 永遠(yuǎn)指向最后調(diào)用它的那個(gè)對(duì)象,這就是精髓。最關(guān)鍵所在 this的四種指向: 當(dāng)this所在的函數(shù)被普通調(diào)用時(shí),指向w

在實(shí)現(xiàn)自己的call,apply,bind前,需要復(fù)習(xí)一下this.

所謂的this其實(shí)可以理解成一根指針:

其實(shí) this 的指向,始終堅(jiān)持一個(gè)原理:this 永遠(yuǎn)指向最后調(diào)用它的那個(gè)對(duì)象,這就是精髓。最關(guān)鍵所在

this的四種指向:

當(dāng)this所在的函數(shù)被普通調(diào)用時(shí),指向window,如果當(dāng)前是嚴(yán)格模式,則指向undefined

function test() {
 console.log(this);
};

test();
指向window 
輸出下面的代碼: // Window {speechSynthesis: SpeechSynthesis, caches: CacheStorage, localStorage: Storage, sessionStorage: Storage, webkitStorageInfo: DeprecatedStorageInfo…}
嚴(yán)格模式
'use strict';
function test() {
 console.log(this);
};
test();
// undefined

當(dāng)this所在當(dāng)函數(shù)被以obj.fn()形式調(diào)用時(shí),指向obj

var obj = {
 name: 'segmentFault',
 foo: function() {
 console.log(this.name);
 }
}
obj.foo();
// 'segmentFault'

還可以這么做

function test() {
 console.log(this.name);
}
var obj = {
 name: 'qiutc',
 foo: test
}
obj.foo();
// 'qiutc'

當(dāng)call,apply加入后,this的指向被改變了

 function a(a,b,c) {
 console.log(this.name);
 console.log(a,b,c)
 }
 const b = {
 name: "segmentFault"
 }
 a.call(b,1,2,3) 
 //
輸出 segmentFault和 1,2,3 function a(a,b,c) { console.log(this.name); console.log(a,b,c) } a.apply(b,[1,2,3]) //輸出segmentFault和1,2,3

遇到bind后 :

 function a() {
 console.log(this.name);
 }
 const b = {
 name: "segmentFault"
 }
 a.bind(b, 1, 2, 3)

此時(shí)控制臺(tái)并沒(méi)有代碼輸出,因?yàn)閎ind會(huì)重新生成并且返回一個(gè)函數(shù),這個(gè)函數(shù)的this指向第一個(gè)參數(shù)

 function a() {
 console.log(this.name);
 }
 const b = {
 name: "segmentFault"
 }
 const c = a.bind(b, 1, 2, 3)
 c()
 //此時(shí)
輸出segmentFault

正式開始自己實(shí)現(xiàn)call :

在函數(shù)原型上定義自己的myCall方法:

 Function.prototype.myCall = function (context, ...arg) {
 const fn = Symbol('臨時(shí)屬性')
 context[fn] = this
 context[fn](...arg)
 delete context[fn]
 }

四行代碼實(shí)現(xiàn)了簡(jiǎn)單的call,思路如下:

  • 通過(guò)對(duì)象屬性的方式調(diào)用函數(shù),這個(gè)函數(shù)里面的this指向這個(gè)對(duì)象
  • 每次調(diào)用新增一個(gè)symbol屬性,調(diào)用完畢刪除
  • 這個(gè)symbol屬性就是調(diào)用mycall方法的函數(shù)
  • 函數(shù)形參中使用...arg是將多個(gè)形參都塞到一個(gè)數(shù)組里,在函數(shù)內(nèi)部使用arg這個(gè)變量時(shí),就是包含所有形參的數(shù)組
  • 在調(diào)用 context[fn](...arg)時(shí)候,...arg是為了展開數(shù)組,依次傳入?yún)?shù)調(diào)用函數(shù)
  • 為了簡(jiǎn)化,今天都不做類型判斷和錯(cuò)誤邊際處理,只把原理講清楚。

    自己實(shí)現(xiàn)apply

    在函數(shù)原型上定義自己的myApply方法:

    //實(shí)現(xiàn)自己的myApply
     Function.prototype.myApply = function (context, arg) {
     const fn = Symbol('臨時(shí)屬性')
     context[fn] = this
     context[fn](...arg)
     delete context[fn]
     }
     const obj2 = {
     a: 1
     }
     test.myApply(obj2, [2, 3, 4])

    同理,只是apply傳遞的第二個(gè)參數(shù)是數(shù)組,這里我們只需要在調(diào)用時(shí),將參數(shù)用...把數(shù)組展開即可

    自己實(shí)現(xiàn)bind:

    bind跟apply,call的本質(zhì)區(qū)別,bind不會(huì)改變?cè)瘮?shù)的this指向,只會(huì)返回一個(gè)新的函數(shù)(我們想要的那個(gè)this指向),并且不會(huì)調(diào)用。但是apply和bind會(huì)改變?cè)瘮?shù)的this指向并且直接調(diào)用

    bind在編寫框架源碼,例如koa等中用得特別多:

     //實(shí)現(xiàn)自己的myBind
     Function.prototype.myBind = function (context, ...firstarg) {
     const that = this
     const bindFn = function (...secoundarg) {
     return that.myCall(context, ...firstarg, ...secoundarg)
     }
     bindFn.prototype = Object.create(that.prototype)
     return bindFn
     }
    
     var fnbind = test.myBind(obj, 2)
     fnbind(3)

    同理 自己定義好原型上的myBind方法

    this劫持 保留最初的調(diào)用mybind方法的那個(gè)對(duì)象

    返回一個(gè)新的函數(shù) 這個(gè)新的函數(shù)內(nèi)部this指向已經(jīng)確定,使用的是我們的mycall方法

    學(xué)習(xí)需要循序漸進(jìn),建議根據(jù)本文順序去封裝一遍,是比較輕松的,當(dāng)然bind還需要判斷是否是new調(diào)用.

    完整版本bind

    Function.prototype.myBind = function (objThis, ...params) {
     const thisFn = this; // 存儲(chǔ)源函數(shù)以及上方的params(函數(shù)參數(shù))
     // 對(duì)返回的函數(shù) secondParams 二次傳參
     let fToBind = function (...secondParams) {
     console.log('secondParams',secondParams,...secondParams)
     const isNew = this instanceof fToBind // this是否是fToBind的實(shí)例 也就是返回的fToBind是否通過(guò)new調(diào)用
     const context = isNew ? this : Object(objThis) // new調(diào)用就綁定到this上,否則就綁定到傳入的objThis上
     return thisFn.call(context, ...params, ...secondParams); // 用call調(diào)用源函數(shù)綁定this的指向并傳遞參數(shù),返回執(zhí)行結(jié)果
     };
     fToBind.prototype = Object.create(thisFn.prototype); // 復(fù)制源函數(shù)的prototype給fToBind
     return fToBind; // 返回拷貝的函數(shù)
    };

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    如何使用50行javaScript代碼實(shí)現(xiàn)簡(jiǎn)單版的call,apply,bind

    如何使用50行javaScript代碼實(shí)現(xiàn)簡(jiǎn)單版的call,apply,bind:在實(shí)現(xiàn)自己的call,apply,bind前,需要復(fù)習(xí)一下this. 所謂的this其實(shí)可以理解成一根指針: 其實(shí) this 的指向,始終堅(jiān)持一個(gè)原理:this 永遠(yuǎn)指向最后調(diào)用它的那個(gè)對(duì)象,這就是精髓。最關(guān)鍵所在 this的四種指向: 當(dāng)this所在的函數(shù)被普通調(diào)用時(shí),指向w
    推薦度:
    標(biāo)簽: 簡(jiǎn)單 call javascript
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国内一级一级毛片a免费 | 九九精品成人免费国产片 | 欧美激情综合网 | 另类专区另类专区亚洲 | 亚洲十欧美十日韩十国产 | 国产精品电影一区二区三区 | 日韩一区二区三区免费 | 日韩视频免费 | 伊人逼逼| 国产成人精品一区二区三区… | 日韩在线一区二区三区免费视频 | 久久久国产成人精品 | 国产精品亚洲一区二区在线观看 | 国产欧美日韩综合精品无毒 | 亚洲欧美另类视频 | 91久久综合九色综合欧美98 | 久久国产经典 | 在线亚洲电影 | 综合伊人久久在一二三区 | 国产精品视频一区二区三区 | 国产全部视频在线播放 | 性插动态图| 亚洲欧美中文日韩在线v日本 | 久久精品亚洲欧美日韩久久 | 国产一级特黄全黄毛片 | 国产欧美久久一区二区 | 国产特级全黄一级毛片不卡 | 亚洲专区欧美专区 | 国产精品视频久久久久 | 日本欧美国产精品第一页久久 | 一区二区久久 | 欧美日韩国产码高清综合人成 | 日韩一区二区三区免费 | 成人欧美一区二区三区视频不卡 | 国产原创一区二区 | 欧美激情一区二区三区四区 | 日韩精品第1页 | 日韩精品成人 | 国产欧美日本亚洲精品五区 | 亚洲va欧美ⅴa国产va影院 | 国产高清一区二区三区视频 |