成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端百題斬——快速手撕Call、Apply、Bind

開發 前端
call() 方法使用一個指定的 this 值和單獨給出的一個或多個參數來調用一個函數。其返回值是使用調用者提供的this值和參數調用該函數的返回值,若該方法沒有返回值,則返回undefined。

[[404584]]

在百題斬js中的這些“this”指向都值得了解中已經簡要概述了call、apply、bind三個方法,這三者作用是相同的,均可以改變this指向,從而讓某對象可以調用自身不具備的方法,本節將深入理解這三者的實現原理。

15.1 call()

15.1.1 基礎

call() 方法使用一個指定的 this 值和單獨給出的一個或多個參數來調用一個函數。其返回值是使用調用者提供的this值和參數調用該函數的返回值,若該方法沒有返回值,則返回undefined。

基本用法:

  1. function.call(thisArg, arg1, arg2, ...) 

小試牛刀

  1. function method(val1, val2) { 
  2.     return this.a + this.b + val1 + val2; 
  3.  
  4. const obj = { 
  5.     a: 1, 
  6.     b: 2 
  7. }; 
  8.  
  9. console.log(method.call(obj, 3, 4)); // 10 

15.1.2 實現

實現一個call函數,將通過以下幾個步驟:

  1. 獲取第一個參數(注意第一個參數為null或undefined時,this指向window),構建對象
  2. 將對應函數傳入該對象中
  3. 獲取參數并執行相應函數
  4. 刪除該對象中函數,消除副作用
  5. 返回結果
  1. Function.prototype.myCall = function (context, ...args) { 
  2.     // 獲取第一個參數(注意第一個參數為null或undefined時,this指向window),構建對象 
  3.     context = context ? Object(context) : window; 
  4.     // 將對應函數傳入該對象中 
  5.     context.fn = this; 
  6.     // 獲取參數并執行相應函數 
  7.     let result = context.fn(...args); 
  8.     // 消除副作用 
  9.     delete context.fn; 
  10.     // 返回結果 
  11.     return result; 
  12. // …… 
  13. console.log(method.myCall(obj, 3, 4)); // 10 

15.2 apply()

15.2.1 基礎

apply() 方法調用一個具有給定this值的函數,以及以一個數組(或類數組對象)的形式提供的參數。其返回值是指定this值和參數的函數的結果。call() 和 apply()的區別是call()方法接受的是參數列表,而apply()方法接受的是一個參數數組;

基本用法

  1. func.apply(thisArg, [argsArray]) 

小試牛刀

  1. function method(val1, val2) { 
  2.     return this.a + this.b + val1 + val2; 
  3.  
  4. const obj = { 
  5.     a: 1, 
  6.     b: 2 
  7. }; 
  8.  
  9. console.log(method.apply(obj, [3, 4])); // 10 

15.2.2 實現

apply和call的區別主要是參數的不同,所以其實現步驟的call大體類似,如下所示:

  1. Function.prototype.myApply = function (context, arr) { 
  2.     context = context ? Object(context) : window; 
  3.     context.fn = this; 
  4.  
  5.     let result = arr ? context.fn(...arr) : context.fun(); 
  6.  
  7.     delete context.fn; 
  8.  
  9.     return result; 
  10. // …… 
  11. console.log(method.myApply(obj, [3, 4])); // 10 

15.3 bind()

15.3.1 基礎

bind() 方法創建一個新的函數,在 bind() 被調用時,這個新函數的 this 被指定為 bind() 的第一個參數,而其余參數將作為新函數的參數,供調用時使用。該函數的返回值是一個原函數的拷貝,并擁有指定的this值和初始參數。

基本用法

  1. function.bind(thisArg[, arg1[, arg2[, ...]]]) 

小試牛刀

  1. function method(val1, val2) { 
  2.     return this.a + this.b + val1 + val2; 
  3.  
  4. const obj = { 
  5.     a: 1, 
  6.     b: 2 
  7. }; 
  8.  
  9. const bindMethod = method.bind(obj, 3, 4); 
  10. console.log(bindMethod()); // 10 

15.3.2 實現

實現一個bind函數相對較復雜一些,應該注意以下幾點:

  1. 能夠改變this指向;
  2. 返回的是一個函數;
  3. 能夠接受多個參數;
  4. 支持柯里化形式傳參 fun(arg1)(arg2);
  5. 獲取到調用bind()返回值后,若使用new調用(當做構造函數),bind()傳入的上下文context失效。
  1. Function.prototype.myBind = function (context, ...args) { 
  2.     if (typeof(this) !== 'function') { 
  3.         throw new TypeError('The bound object needs to be a function'); 
  4.     } 
  5.  
  6.     const self = this; 
  7.     // 定義一個中裝函數 
  8.     const fNOP = function() {}; 
  9.     const fBound = function(...fBoundArgs) { 
  10.         // 利用apply改變this指向 
  11.         // 接受多個參數+支持柯里化形式傳參 
  12.         // 當返回值通過new調用時,this指向當前實例 (因為this是當前實例,實例的隱士原型上有fNOP的實例(fnop);fnop instanceof fNOP為true) 
  13.         return self.apply(this instanceof fNOP ? this : context, [...args, ...fBoundArgs]); 
  14.     } 
  15.  
  16.     // 將調用函數的原型賦值到中轉函數的原型上 
  17.     if (this.prototype) { 
  18.         fNOP.prototype = this.prototype; 
  19.     } 
  20.     // 通過原型的方式繼承調用函數的原型 
  21.     fBound.prototype = new fNOP(); 
  22.  
  23.     return fBound; 

本文轉載自微信公眾號「執鳶者」,可以通過以下二維碼關注。轉載本文請聯系執鳶者公眾號。

 

責任編輯:武曉燕 來源: 執鳶者
相關推薦

2021-06-16 07:03:37

New操作符函數

2024-03-15 08:21:17

bindJavaScrip函數

2021-12-03 06:59:23

操作符驗證點屬性

2021-10-19 22:23:05

typeof方式Instanceof

2021-05-09 22:00:59

TypeofInstanceof運算符

2021-12-05 08:27:56

Javascript 高階函數前端

2021-06-18 07:16:17

JavaScript apply()方法call()方法

2021-05-30 19:02:59

變量對象上下文

2021-07-14 07:00:53

瀏覽器技巧前端

2021-10-18 09:01:01

前端賦值淺拷貝

2021-08-04 06:56:49

HTTP緩存前端

2015-03-02 09:22:09

Javascript函數用法apply

2017-10-10 14:36:07

前端Javascriptapply、call、

2024-08-26 14:35:19

JavaScript關鍵字對象

2021-11-30 06:56:58

CallApply函數

2021-05-12 07:04:55

Js變量方式

2021-11-19 09:01:09

防抖節流前端

2021-06-04 07:04:29

閉包JavaScript函數

2021-07-26 05:01:55

瀏覽器渲染流程

2021-06-28 07:12:28

賦值淺拷貝深拷貝
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩综合视频 | 一级黄色片一级黄色片 | 91在线第一页 | 在线一区二区三区 | 黄网站涩免费蜜桃网站 | 亚洲一区二区网站 | 中文字幕免费在线 | 91毛片在线观看 | 日本久久久久久 | 黄色一级免费 | 在线播放中文字幕 | 91久久国产综合久久 | 欧美一级毛片久久99精品蜜桃 | 国产高清免费在线 | 九色.com| 综合视频在线 | 黄在线免费观看 | 亚洲视频免费播放 | 天天综合日日夜夜 | 久久精品一区二区 | 天堂一区二区三区 | 亚洲一区国产精品 | 99久久精品国产一区二区三区 | 精品视频一区二区三区在线观看 | 国产999精品久久久 精品三级在线观看 | 黄色免费在线观看 | 狠狠狠色丁香婷婷综合久久五月 | 91中文字幕在线观看 | 欧美老妇交乱视频 | 国产欧美日韩一区二区三区 | 国产成人久久 | 九色 在线 | 国产激情 | 免费精品一区 | 日本成人在线免费视频 | 久久久国产一区二区三区 | 精品久久成人 | 国产精彩视频在线观看 | 国产区视频在线观看 | 国产精品成人一区二区三区 | 国产一区二区精品 |