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

解析 Call/Apply 原理,并手寫 Call/Apply 實現

開發 前端
apply() 方法調用一個具有給定 this 值的函數,以及作為一個數組(或[類似數組對象)提供的參數。

[[437510]]

本文轉載自微信公眾號「三分鐘學前端」,作者sisterAn  。轉載本文請聯系三分鐘學前端公眾號。

Function.prototype.call()

call() 方法調用一個函數, 其具有一個指定的 this 值和多個參數(參數的列表)。

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

它運行 func,提供的第一個參數 thisArg 作為 this,后面的作為參數。

看一個簡單的例子:

  1. function sayWord() { 
  2.   var talk = [this.name'say', this.word].join(' '); 
  3.   console.log(talk); 
  4.  
  5. var bottle = { 
  6.   name'bottle',  
  7.   word: 'hello' 
  8. }; 
  9.  
  10. // 使用 call 將 bottle 傳遞為 sayWord 的 this 
  11. sayWord.call(bottle);  
  12. // bottle say hello 

所以,call 主要實現了以下兩個功能:

  • call 改變了 this 的指向
  • bottle 執行了 sayWord 函數

模擬實現 call

模擬實現 call 有三步:

  • 將函數設置為對象的屬性
  • 執行函數
  • 刪除對象的這個屬性
  1. Function.prototype.call = function (context) { 
  2.   // 將函數設為對象的屬性 
  3.   // 注意:非嚴格模式下,  
  4.   //   指定為 null 和 undefined 的 this 值會自動指向全局對象(瀏覽器中就是 window 對象) 
  5.   //   值為原始值(數字,字符串,布爾值)的 this 會指向該原始值的自動包裝對象(用 Object() 轉換) 
  6.   context = context ? Object(context) : window;  
  7.   context.fn = this; 
  8.      
  9.   // 執行該函數 
  10.   let args = [...arguments].slice(1); 
  11.   let result = context.fn(...args); 
  12.      
  13.   // 刪除該函數 
  14.   delete context.fn 
  15.   // 注意:函數是可以有返回值的 
  16.   return result; 

Function.prototype.apply()

apply() 方法調用一個具有給定 this 值的函數,以及作為一個數組(或[類似數組對象)提供的參數。

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

它運行 func 設置 this = context 并使用類數組對象 args 作為參數列表。

例如,這兩個調用幾乎相同:

  1. func(1, 2, 3); 
  2. func.apply(context, [1, 2, 3]) 

兩個都運行 func 給定的參數是 1,2,3。但是 apply 也設置了 this = context。

call 和 apply 之間唯一的語法區別是 call 接受一個參數列表,而 apply 則接受帶有一個類數組對象。

需要注意:Chrome 14 以及 Internet Explorer 9 仍然不接受類數組對象。如果傳入類數組對象,它們會拋出異常。

模擬實現 apply

  1. Function.prototype.apply = function (context, arr) { 
  2.     context = context ? Object(context) : window;  
  3.     context.fn = this; 
  4.    
  5.     let result; 
  6.     if (!arr) { 
  7.         result = context.fn(); 
  8.     } else { 
  9.         result = context.fn(...arr); 
  10.     } 
  11.        
  12.     delete context.fn 
  13.     return result; 

 

責任編輯:武曉燕 來源: 三分鐘學前端
相關推薦

2024-03-15 08:21:17

bindJavaScrip函數

2024-08-26 14:35:19

JavaScript關鍵字對象

2021-12-05 08:27:56

Javascript 高階函數前端

2011-03-22 09:49:15

JavaScript

2021-06-18 07:16:17

JavaScript apply()方法call()方法

2021-06-09 07:01:30

前端CallApply

2017-10-10 14:36:07

前端Javascriptapply、call、

2015-03-02 09:22:09

Javascript函數用法apply

2024-08-26 08:36:26

2024-08-20 16:04:27

JavaScript開發

2021-12-01 06:40:32

Bind原理實現

2011-08-15 12:55:54

SQL ServerOUTER APPLYCROSS APPLY

2022-02-17 20:57:07

OpenHarmon操作系統鴻蒙

2009-06-24 11:12:17

callerJavascript

2020-12-18 05:42:46

reduxactions

2015-12-24 09:48:40

JavaScriptthis指針深

2022-07-27 08:27:34

Call前端

2022-06-16 11:06:07

開源Grafanaon-call

2021-04-18 07:58:22

SQL Server數據庫Apply

2025-05-12 08:50:00

apply()Pandas函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九天堂网 | 国产片一区二区三区 | 成人午夜影院 | 欧美性猛交 | 成人影院网站ww555久久精品 | 欧美日韩免费在线 | a国产视频 | 一区二区三区精品在线 | www国产成人免费观看视频,深夜成人网 | 亚洲成人三级 | 久久精品一区二区三区四区 | 日韩久草 | 国产精品久久久久久婷婷天堂 | 精品在线视频播放 | 麻豆av网| 欧美日韩中文字幕在线播放 | 黄色毛片网站在线观看 | www97影院 | 久久免费小视频 | 久久精品欧美一区二区三区麻豆 | 国产精品国产成人国产三级 | 日本黄色免费视频 | 国产成人精品网站 | 日韩av啪啪网站大全免费观看 | 91免费观看国产 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 天天干天天想 | 久久精品91久久久久久再现 | 91精品亚洲 | 中文精品久久 | 国产精品18久久久久久久 | 日日草夜夜草 | 一区二区免费看 | 亚洲成人午夜电影 | 亚洲一区久久 | 精品国产1区2区3区 在线国产视频 | 91久久 | 亚洲性在线 | 亚洲高清视频在线观看 | 日本国产精品视频 | 精品亚洲一区二区三区 |