精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Js 實現 Bind 的這五層,你在第幾層?

開發 前端
最近在幫女朋友復習 JS 相關的基礎知識,遇到不會的問題,她就會來問我。

 [[398743]]

本文轉載自微信公眾號「秋風的筆記」,作者藍色的秋風 。轉載本文請聯系秋風的筆記公眾號。

最近在幫女朋友復習 JS 相關的基礎知識,遇到不會的問題,她就會來問我。

這不是很簡單?三下五除二,分分鐘解決。

  1. function bind(fn, obj, ...arr) { 
  2.  return fn.apply(obj, arr) 

于是我就將這段代碼發了過去

這時候立馬被女朋友進行了一連串的靈魂拷問。

這個時候,我馬老師就坐不住了,我不服氣,我就去復習了一下 bind,發現太久不寫基礎代碼,還是會需要一點時間復習,這一次我得寫一個有深度的 bind,深得馬老師的真傳,給他分成了五層速記法。

[[398746]]

第一層 - 綁定在原型上的方法

這一層非常的簡單,得益于 JS 原型鏈的特性。由于 function xxx 的原型鏈 指向的是 Function.prototype , 因此我們在調用 xxx.bind 的時候,調用的是 Function.prototype 上的方法。

  1. Function.prototype._bind = function() {} 

這樣,我們就可以在一個構造函數上直接調用我們的bind方法啦~例如像這樣。

  1. funciton myfun(){} 
  2. myfun._bind(); 

想要詳細理解這方面的可以看這張圖和這篇文章(https://github.com/mqyqingfeng/blog/issues/2)

第二層 - 改變 this 的指向

這可以說是 bind 最核心的特性了,就是改變 this 的指向,并且返回一個函數。而改變 this , 我們可以通過已知的 apply 和 call 來實現,這里我們就暫且使用 apply 來進行模擬。首先通過 self 來保存當前 this,也就是傳入的函數。因為我們知道 this 具有 隱式綁定的規則(摘自 《你不知道的JavaScript(上)》2.2.2 ),

  1. function foo() {console.log(this.a)} 
  2. var obj = {a: 2, foo}; 
  3. obj.foo(); // 2 

通過以上特性,我們就可以來寫我們的 _bind 函數。

  1. Function.prototype._bind = function(thisObj) { 
  2.  const self = this; 
  3.  return function () { 
  4.     self.apply(thisObj); 
  5.   } 
  6. var obj = {a:1} 
  7. function myname() {console.log(this.a)} 
  8. myname._bind(obj)(); // 1 

可能很多朋友都止步于此了,因為在一般的面試中,特別是一些校招面試中,可能你只需要知道前面兩個就差不多了。但是想要在面試中驚艷所有人,仍然是不夠的,接下來我們繼續我們的探索與研究。

第三層 - 支持柯里化

函數柯里化是一個老生常談的話題,在這里再復習一下。

  1. function fn(x) { 
  2.  return function (y) { 
  3.   return x + y; 
  4.  } 
  5. var fn1 = fn(1); 
  6. fn1(2) // 3 

不難發現,柯里化使用了閉包,當我們執行 fn1 的時候,函數內使用了外層函數的 x, 從而形成了閉包。

而我們的 bind 函數也是類似,我們通過獲取當前外部函數的 arguments ,并且去除了綁定的對象,保存成變量 args,最后 return 的方法,再一次獲取當前函數的 arguments, 最終用 finalArgs 進行了一次合并。

  1. Function.prototype._bind = function(thisObj) { 
  2.  const self = this; 
  3.   const args = [...arguments].slice(1) 
  4.  return function () { 
  5.     const finalArgs = [...args, ...arguments] 
  6.     self.apply(thisObj, finalArgs); 
  7.   } 

通過以上代碼,讓我們 bind 方法,越來越健壯了。

  1. var obj = { i: 1} 
  2. function myFun(a, b, c) { 
  3.   console.log(this.i + a + b + c); 
  4. var myFun1 = myFun._bind(obj, 1, 2); 
  5. myFun1(3); // 7 

一般到了這層,可以說非常棒了,但是再堅持一下下,就變成了完美的答卷。

第四層 - 考慮 new 的調用

要知道,我們的方法,通過 bind 綁定之后,依然是可以通過 new 來進行實例化的, new 的優先級會高于 bind(摘自 《你不知道的JavaScript(上)》2.3 優先級)。

這一點我們通過原生 bind 和我們第四層的 _bind 來進行驗證對比。

  1. // 原生 
  2. var obj = { i: 1} 
  3. function myFun(a, b, c) { 
  4.   // 此處用new方法,this指向的是當前函數 myFun  
  5.   console.log(this.i + a + b + c); 
  6. var myFun1 = myFun.bind(obj, 1, 2); 
  7. new myFun1(3); // NAN 
  8.  
  9. // 第四層的 bind 
  10. var obj = { i: 1} 
  11. function myFun(a, b, c) { 
  12.   console.log(this.i + a + b + c); 
  13. var myFun1 = myFun._bind(obj, 1, 2); 
  14. new myFun1(3); // 7 

注意,這里使用的是 bind方法

因此我們需要在 bind 內部,對 new 的進行處理。而 new.target 屬性,正好是用來檢測構造方法是否是通過 new 運算符來被調用的。

接下來我們還需要自己實現一個 new ,

而根據 MDN,new 關鍵字會進行如下的操作:

1.創建一個空的簡單JavaScript對象(即{});

2.鏈接該對象(設置該對象的constructor)到另一個對象 ;

3.將步驟1新創建的對象作為this的上下文 ;

4.如果該函數沒有返回對象,則返回this。

  1. Function.prototype._bind = function(thisObj) { 
  2.  const self = this; 
  3.   const args = [...arguments].slice(1); 
  4.  return function () { 
  5.     const finalArgs = [...args, ...arguments]; 
  6.   // new.target 用來檢測是否是被 new 調用 
  7.     if(new.target !== undefined) { 
  8.       // this 指向的為構造函數本身 
  9.       var result = self.apply(this, finalArgs); 
  10.       // 判斷改函數是否返回對象 
  11.       if(result instanceof Object) { 
  12.         return reuslt; 
  13.       } 
  14.       // 沒有返回對象就返回 this 
  15.       return this; 
  16.     } else { 
  17.       // 如果不是 new 就原來的邏輯 
  18.       return self.apply(thisArg, finalArgs); 
  19.     } 
  20.   } 

看到這里,你的造詣已經如火純情了,但是最后還有一個小細節。

第五層 - 保留函數原型

以上的方法在大部分的場景下都沒有什么問題了,但是,當我們的構造函數有 prototype 屬性的時候,就出問題啦。因此我們需要給 prototype 補上,還有就是調用對象必須為函數。

  1. Function.prototype._bind = function (thisObj) { 
  2.   // 判斷是否為函數調用 
  3.   if (typeof target !== 'function' || Object.prototype.toString.call(target) !== '[object Function]') { 
  4.     throw new TypeError(this + ' must be a function'); 
  5.   } 
  6.   const self = this; 
  7.   const args = [...arguments].slice(1); 
  8.   var bound = function () { 
  9.     var finalArgs = [...args, ...arguments]; 
  10.     // new.target 用來檢測是否是被 new 調用 
  11.     if (new.target !== undefined) { 
  12.       // 說明是用new來調用的 
  13.       var result = self.apply(this, finalArgs); 
  14.       if (result instanceof Object) { 
  15.         return result; 
  16.       } 
  17.       return this; 
  18.     } else { 
  19.       return self.apply(thisArg, finalArgs); 
  20.     } 
  21.   }; 
  22.   if (self.prototype) { 
  23.     // 為什么使用了 Object.create? 因為我們要防止,bound.prototype 的修改而導致self.prototype 被修改。不要寫成 bound.prototype = self.prototype; 這樣可能會導致原函數的原型被修改。 
  24.     bound.prototype = Object.create(self.prototype); 
  25.     bound.prototype.constructor = self; 
  26.   } 
  27.   return bound; 
  28. }; 

以上就是一個比較完整的 bind 實現了,如果你想了解更多細節的實踐,可以查看。(也是 MDN 推薦的)

https://github.com/Raynos/function-bind

 

責任編輯:武曉燕 來源: 秋風的筆記
相關推薦

2021-12-10 09:11:36

TypeScript 函數重載 TS 前端

2022-08-29 08:48:59

Go函數工廠模式

2021-12-16 06:52:33

Ceph分布式對象

2021-10-29 21:26:39

前端引擎層類型

2009-05-25 15:00:20

2024-03-15 08:21:17

bindJavaScrip函數

2016-09-23 16:09:01

2022-04-05 11:29:40

Linux安裝操作系統

2022-01-18 16:42:03

區塊鏈加密信息資源

2021-12-01 06:40:32

Bind原理實現

2012-06-21 15:50:20

JavaScript

2009-01-14 17:46:01

RHELBindDNS

2022-03-07 10:22:07

DevOps開發工具

2023-04-24 08:11:02

圖片alt語音

2024-11-14 07:20:00

2025-04-03 09:56:40

Python算法開發

2016-08-22 23:56:48

超融合HCI

2016-03-28 17:00:32

互聯網運維體系運維

2022-07-08 08:21:26

JSbind 方法

2015-08-18 09:52:19

app推廣規劃
點贊
收藏

51CTO技術棧公眾號

国产精品美女一区二区在线观看| 欧美网色网址| 亚洲欧美成人一区二区三区| 国产精品丝袜久久久久久高清| 国产又粗又猛又爽又黄的视频四季 | 一级成人国产| 一区二区三区在线播放欧美| 国产女同无遮挡互慰高潮91| 91白丝在线| 国产欧美日韩另类视频免费观看 | 国产一区精品二区| 精品女厕一区二区三区| 一区一区视频| 五月天福利视频| 久久99久久99| 992tv在线成人免费观看| 国产精品天天干| 99精品在免费线中文字幕网站一区 | 中文不卡1区2区3区| 国产精品视频yy9299一区| 动漫美女被爆操久久久| 中文字幕一区二区三区四区免费看| 欧美特黄一区| 北条麻妃久久精品| 成人性生交大免费看| 国产日本亚洲| 欧美三级一区二区| 亚洲熟妇av日韩熟妇在线 | 欧美极品少妇xxxxⅹ裸体艺术| 国精产品一区二区三区| av毛片精品| 欧美日本国产视频| 毛片一区二区三区四区| 色屁屁www国产馆在线观看| 欧美国产日韩一二三区| 国产一区二区中文字幕免费看| 国产又大又粗又硬| 日韩激情视频网站| 2019精品视频| 久久精品www| 91免费精品| 亚洲人成在线观看| 妖精视频一区二区| 日韩免费一级| 制服丝袜中文字幕一区| 午夜精品在线免费观看| 亚洲欧美韩国| 精品国产乱码久久久久久虫虫漫画| 久久久成人精品一区二区三区| 国产一区二区影视| 久久嫩草精品久久久精品一| 国产日韩精品推荐| 黄频在线免费观看| 成人性生交大片免费看视频在线| 91系列在线观看| 国产精品九九九九| 久久国产综合精品| 国产区精品视频| 中文字幕精品一区二| 日韩国产欧美在线视频| 国产福利精品视频| 波多野结衣在线电影| 日本不卡123| 国产精品一区二区久久| 中日韩在线观看视频| 日本美女视频一区二区| 国产精品一区二区三区成人| 中文字幕日本视频| 捆绑调教一区二区三区| 91精品久久久久久久久久久| 国产又大又粗又硬| 国产一区二区三区在线观看免费 | 久久精品国产sm调教网站演员| 国产丝袜在线观看视频| 午夜亚洲福利老司机| 青青视频在线播放| 日本成人片在线| 欧美三区在线观看| 日本在线视频播放| 欧美freesex8一10精品| 亚洲美女又黄又爽在线观看| www..com.cn蕾丝视频在线观看免费版 | 欧美日韩久久一区| 日本中文字幕精品| 久久久伦理片| 一色桃子一区二区| 欧美偷拍第一页| 一区免费在线| 日韩av手机在线观看| 伊人22222| 国产99精品国产| 蜜桃精品久久久久久久免费影院| 精品福利视频导航大全| 亚洲色图19p| 人人干视频在线| 成人涩涩视频| 欧美成人精品二区三区99精品| 色婷婷精品久久二区二区密| gogogo高清在线观看一区二区| 久久这里有精品| 国产精品男女视频| 狠狠色2019综合网| 女人一区二区三区| 肉体视频在线| 欧美色爱综合网| 男男一级淫片免费播放| 日韩一区二区在线| 欧美在线xxx| 99久久精品国产成人一区二区| 99久久免费国产| 免费观看国产视频在线| a日韩av网址| 日韩欧美三级在线| 黄色国产在线播放| 嫩草成人www欧美| 91久久精品www人人做人人爽| 久久电影中文字幕| 亚洲成人黄色影院| 在线播放免费视频| 国产一区二区三区91| 久久久久久久999| 国产精品一级二级| 欧美激情综合在线| 成年网站在线免费观看| 97久久亚洲| 久久精品国产亚洲精品| 懂色av中文字幕| 99精品欧美一区| 超碰超碰超碰超碰超碰| 日本亚洲欧洲无免费码在线| 亚洲欧美三级在线| 久久久久久久久久影院| 国产成人av福利| 久久av秘一区二区三区| 99久久伊人| 亚洲午夜未删减在线观看| 日韩精品视频播放| 成人黄色大片在线观看 | 欧美午夜一区二区三区| 可以直接看的无码av| 精品69视频一区二区三区Q| 亚洲free性xxxx护士白浆| 午夜在线免费观看视频| 在线精品视频免费播放| 91网站免费视频| 性一交一乱一区二区洋洋av| 国产视频精品网| 麻豆蜜桃在线| 精品sm在线观看| 免费毛片在线播放免费| 高清在线观看日韩| 美脚丝袜脚交一区二区| 红杏视频成人| 777国产偷窥盗摄精品视频| 欧美一级做性受免费大片免费| 一区二区三区日本| 美女又黄又免费的视频| 亚洲视频狠狠| 国产一区二区精品在线| 神马午夜在线视频| 亚洲人成电影在线| 中国一区二区视频| 亚洲女性喷水在线观看一区| 亚洲视频在线不卡| 国语自产精品视频在线看8查询8| 国产99在线免费| 超碰资源在线| 亚洲人成网站色ww在线| 老熟妇一区二区三区啪啪| 国产精品欧美久久久久一区二区 | 欧美成人黑人| 中国日韩欧美久久久久久久久| 中文字幕一区二区人妻| 亚洲精品美腿丝袜| 天天插天天射天天干| 久久av在线| 亚洲精品中字| 日韩一区二区三区高清在线观看| 国内伊人久久久久久网站视频 | 黄色特一级视频| 丁香婷婷成人| 国产不卡一区二区在线播放| 在线视频91p| 日韩午夜av一区| www成人在线| 欧美激情一二三区| 欧美xxxx黑人| 老司机精品视频网站| 一区在线电影| 日韩一级电影| 91精品视频在线播放| 黄色在线看片| 永久免费毛片在线播放不卡| av在线亚洲天堂| 一本久道久久综合中文字幕| 小嫩苞一区二区三区| 成人深夜视频在线观看| 色综合天天色综合| 在线免费高清一区二区三区| 视频一区视频二区视频| 99国产精品久久一区二区三区| 国产精品福利无圣光在线一区| caoporm免费视频在线| 国产视频精品免费播放| 国产wwwwwww| 在线免费视频一区二区| 久一区二区三区| 国产精品日韩精品欧美在线| 亚洲欧美在线不卡| 国产不卡视频在线观看| 欧美伦理片在线观看| 中文一区在线| 色乱码一区二区三区熟女| 久久99影视| 国产一级二级三级精品| 精品精品视频| 国产精品视频永久免费播放| 神马久久午夜| 久久久久久伊人| 二区三区在线观看| 中日韩美女免费视频网址在线观看| 农村少妇久久久久久久| 3atv一区二区三区| 一级黄色短视频| 欧洲另类一二三四区| 国产小视频在线免费观看| 亚洲一区在线视频观看| 一区二区国产精品精华液| 国产清纯美女被跳蛋高潮一区二区久久w| 国产婷婷在线观看| 成人在线综合网| 免费黄频在线观看| 激情欧美一区二区三区在线观看| 黄色a级片免费| 免费欧美日韩| 黄色片久久久久| 午夜影院日韩| 黄色片视频在线免费观看| 韩国av一区| 国产一区二区四区| 激情成人亚洲| 麻豆tv在线播放| 国产精品啊啊啊| 国产一区二区三区小说| 好看的亚洲午夜视频在线| 日韩精品在线观看av| 欧美视频成人| 久久久久久人妻一区二区三区| 韩日成人在线| 男的插女的下面视频| 在线日韩电影| 欧美成人高潮一二区在线看| 亚洲精选国产| 免费无码国产v片在线观看| 亚洲欧美卡通另类91av| 日韩av资源在线| 老司机亚洲精品| av丝袜天堂网| 久久福利资源站| 热久久久久久久久| 国产真实乱对白精彩久久| 亚洲制服在线观看| 粉嫩蜜臀av国产精品网站| 亚洲精品在线视频免费观看| 久久久99久久精品欧美| 国产欧美小视频| 中文字幕一区二区视频| 精品国产精品国产精品| 亚洲一区二区在线播放相泽| 日韩三级小视频| 日本韩国欧美三级| 91亚洲国产成人精品一区| 日韩三级在线免费观看| 十八禁一区二区三区| 亚洲另类图片色| av电影在线网| 欧美高清在线观看| 成人福利av| 国产一区二区在线免费| 成人午夜三级| 日本一区网站| 中文字幕一区二区三三| 欧美亚洲精品一区二区| 蜜乳av一区二区三区| 国产伦精品一区二区三区妓女下载| 成人动漫中文字幕| 亚洲第一综合网| 亚洲主播在线播放| 在线观看 亚洲| 欧美一区二区三区免费| 青青操视频在线| 久久久精品视频成人| 高潮在线视频| 成人免费视频在线观看超级碰| 国产另类在线| 亚洲欧美日韩精品在线| 亚洲国产综合在线看不卡| 中文字幕在线综合| 成人18视频在线播放| 欧美性猛交xxxx乱大交少妇| 亚洲国产精品久久人人爱蜜臀 | 日本亚洲一区二区| 女同性αv亚洲女同志| 国产婷婷一区二区| 在线免费观看毛片| 91精品在线免费观看| 免费在线视频你懂得| 九九热最新视频//这里只有精品| 成人黄色免费短视频| 成人在线视频网址| 久久精品亚洲人成影院| 国产精品亚洲a| 成人午夜av影视| 91久久久久久久久久久久久久| 欧美日韩精品中文字幕| 精品人妻一区二区三区三区四区| 夜夜嗨av一区二区三区免费区| 蜜臀av在线| 亚洲jizzjizz日本少妇| 欧美综合一区| 国产成人a亚洲精v品无码| 国产成人精品网址| 亚洲 欧美 变态 另类 综合| 日本韩国一区二区三区| 婷婷丁香花五月天| 欧美日韩国产999| 成年永久一区二区三区免费视频| 日韩免费一区二区三区| 欧美亚洲三级| 亚洲欧美日本一区| 亚洲一区二区av电影| 国产xxxxxx| 超在线视频97| 国产在线不卡一区二区三区| 亚洲一区精品视频| 日本不卡在线视频| 夜夜春很很躁夜夜躁| 欧美三级欧美成人高清www| 色婷婷中文字幕| 久久久久亚洲精品成人网小说| 91丨精品丨国产| 黄色www在线观看| 精品一区二区三区免费观看| 国产精品精品软件男同| 欧美日韩视频一区二区| 麻豆网站在线| 91免费人成网站在线观看18| 亚洲影视一区| 成年人看片网站| 亚洲一区二区av在线| 手机看片国产1024| 91福利视频在线观看| 午夜精品福利影院| 熟妇人妻va精品中文字幕| 国产日韩精品一区二区三区 | 精品亚洲欧美日韩| 亚洲一区久久| 亚洲av综合一区二区| 色久优优欧美色久优优| 啊v在线视频| 国模大胆一区二区三区| 亚洲欧美清纯在线制服| 无限资源日本好片| 国产日本亚洲高清| 奴色虐av一区二区三区| 这里只有精品视频| 精品自拍视频| 免费观看中文字幕| 国产成人av一区二区三区在线观看| 欧美精品入口蜜桃| 亚洲激情视频网| 人人鲁人人莫人人爱精品| 日韩国产欧美一区| 久久91精品久久久久久秒播| 破处女黄色一级片| 精品国产百合女同互慰| av剧情在线观看| 欧美日韩精品免费观看| 日本一不卡视频| 久久久久久久久毛片| 亚洲精品美女在线观看| 亚洲综合在线电影| 好吊色这里只有精品| 成人永久aaa| 亚洲av无码不卡| 久久成年人视频| 免费观看性欧美大片无片| 久久久久久久久影视| 97se亚洲国产综合自在线| 进去里视频在线观看| 久久6精品影院| 教室别恋欧美无删减版| 波多野结衣国产精品| 婷婷久久综合九色综合绿巨人| 1769视频在线播放免费观看| 国产精品9999久久久久仙踪林| 日产国产欧美视频一区精品| 国产精品九九九九九九| 亚洲欧美国内爽妇网| 欧美专区一区|