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

前端面試題:Call的用法及實現

開發 前端
手寫 Call,核心在于通過另一種修改 this 指向的方式:Obj.fn() 執行時 This 會指向Obj 對象。

大家好,我是前端西瓜哥。

我之前寫了一篇手寫 bind 的文章,里面直接使用了原生 call 方法。

有讀者說他面試的時候這個 call 也要求自己實現的。

那我們今天來手寫 call。apply 的實現也是一樣,只是調用形式有點區別。

call 的用法

我們先看看 Function.prototype.call() 的用法。

call() 可以修改函數調用時 this 的指向,其余參數則會作為原函數的參數。

call 接收的參數:

  1. 第一個參數 thisArg。代表 this 將會被指向的值。如果不是對象,也會通過 Object() 方法轉換為對象。如果是 null 或 undefined,this 則會指向全局對象(即 window 或 global),或在嚴格模式("use strict;")下,保持 undefined 或 null;
  2. 其余參數。第二個往后的參數則會傳入到原函數中。

例子:

function sum(num1, num2) {
return this.val + num1 + num2;
}
const obj = { val: 1 };
sum.call(obj, 2, 3); // 6

上面代碼中,this 指向了 obj。

Function.prototype.apply 也是類似,但它的參數是以數組的形式存在的。上面的 call 寫法等價于:

sum.call(obj, [2, 3]);

call 的實現

JS 函數中的 this 指向是在運行時決定的,里面的規則比較多,但其中有一條是:

如果是通過 obj.fn() 執行時,this 會指向前面的 obj 對象。

那我們只要將傳入對象和原方法進行拼接,拼成上面這個 對象.方法 的形式,執行時,this 就能乖乖指向我們傳入的 thisArg 了。

實現如下:

Function.prototype.myCall = function(thisArg, ...args) {
const context = Object(thisArg) || window;
// 構造唯一 key
const fn = Symbol();
// 組裝成"對象.方法"形式并調用,來改變 this
context[fn] = this;
const ret = context[fn](...args);
// 刪掉臨時加的 key,復原 thisArg
delete context[fn];
return ret;
}

這里我們用 Symbol() 創建了一個唯一的 key,是為了防止覆蓋掉 thisArg 原有的同名屬性。

執行完后,記得將這個 key 移除掉,防止污染 thisArg 對象。

如果面試官要你用 ES5 實現,那會復雜很多,我這里也給出實現吧。

在這之前,我們先來學點前置知識。

判斷是否為嚴格模式

var strict = (function() { return !this })();

利用了嚴格模式下,如果沒有指定 this(通過 bind、call、前面帶對象等方式),就會得到 undefined 的機制。如果是非嚴格模式,this 會拿到全局變量。

fn(...args) 的 ES5 實現

ES6 的擴展運算符 ... 能夠將數組 args,進行拆分按順序放到函數中。

const args = [4, 5, 6];
fn(...args);
// 等價于
fn(4, 5, 6);

那我們用 ES5,也能將數組拆分成一個參數塞到函數中嗎?

可以,但我們要用一點奇技淫巧:Function 方法。

Function 方法用得比較少。它可以在運行時創建一個函數,最后一個參數是函數體內容,前面的參數則是函數的參數。

const sum = new Function('a', 'b', 'return a + b');
sum(2, 6) // 8

fn(...args) 的 ES5 實現為:

function construct(fn, args) {
var list = [];
for (var i = 0; i < args.length; i++) {
list[i] = 'a[' + i + ']';
}
var f = new Function('fn', 'a', 'return fn(' + list.join(', ') + ')');
return f(fn, args);
}

Function 方法可以根據參數長度,動態生成 new Function('fn', 'a', 'return fn(a[0], a[1])') 形式的函數,來實現類似擴展運算符的效果。

還有種寫法是用 eval,也能根據字符串動態生成可執行代碼。

function construct(fn, a) {
var list = [];
for (var i = 0; i < a.length; i++) {
list[i] = 'a[' + i + ']';
}
return eval('fn(' + list.join(', ') + ')');
}

但這種封裝成一個函數的寫法,會有 this 隱式丟失問題。比如執行 construct(dog.bark, ['bark!']),執行時 this 將不再指向對象 dog。

關于 this 的指向問題還是比較復雜的,以后我會專門寫一篇文章來講解 this。

call 的 ES5 實現

Function.prototype.myCall = function(thisArg/*, ...args */) {
var context = Object(thisArg) || window;
context.fn = this;
// 偷懶用了 Array.prototype.slice + 原生 call
// 請讀者自行實現 slice
var a = Array.prototype.slice.call(arguments, 1);
var list = [];
for (var i = 0; i < a.length; i++) {
list[i] = 'a[' + i + ']';
}
var ret = eval('context.fn(' + list.join(',') + ')');
delete context.fn; // 復原
return ret;
}

為了不被干擾,上面的代碼實現 忽略掉了一些細節。

  • 這里我沒有用前面實現的 construct 方法,因為會丟失 this,所以直接用了 eval。
  • slice 請自行實現,不能用 Array.prototype.slice.call,因為用了原生的 call。
  • 我們用了一個字符串 'fn'來臨時掛載函數,可能會和 thisArg 上的屬性名沖突,但 ES5 又不能用 Symbol,這種情況下。更好的做法是生成一個隨機的長字符串,用hasOwnProperty判斷對象是否存在該屬性,如果不存在就使用它。
  • this 不可調用時(即不是函數時),要拋出錯誤。

另外我的實現,沒有考慮嚴格模式。嚴格模式下,如果 thisArg 是 undefined 或 null,直接執行原函數就行了,不需要拼裝成 obj.fn 形式。

結尾

手寫 call,核心在于通過另一種修改 this 指向的方式:obj.fn() 執行時 this 會指向 obj 對象。

手寫 apply 也是一樣的邏輯,還能少寫一個 slice 方法。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-08-27 15:57:28

前端開發

2022-01-18 08:16:52

Web 前端JavaScript

2022-02-09 07:40:42

JavaScript前端面試題

2022-07-08 08:21:26

JSbind 方法

2023-05-19 08:21:40

MarginCSS

2019-02-21 14:12:26

前端面試題Vue

2021-02-02 06:12:39

JavaScript 前端面試題

2018-03-08 18:40:47

Java百度面試題

2017-09-06 09:13:24

2023-12-12 07:40:52

JavaScript面試題前端

2015-07-23 14:13:43

前端開發面試題

2023-04-27 09:08:19

JavaScript隱式類型轉換

2020-11-06 09:05:18

前端web開發

2021-03-15 09:53:37

計算機網絡面試題

2012-06-26 11:09:07

Web

2024-02-26 15:35:44

2018-05-10 16:52:03

阿里巴巴前端面試題

2012-02-02 09:45:24

Web

2009-02-16 13:03:43

華為面試

2011-05-19 16:30:38

軟件測試
點贊
收藏

51CTO技術棧公眾號

99视频热这里只有精品免费| 亚洲观看黄色网| 亚洲最大的黄色网址| 91极品在线| 欧美在线关看| 亚洲视频一区二区在线观看| 欧洲精品毛片网站| 91看片淫黄大片91| 日本视频网站在线观看| 亚洲一区二区三区免费| 国产精品久久久久久亚洲伦| 2019中文字幕免费视频| 日本wwww色| 色综合久久影院| 免费看的黄色欧美网站| 欧美电影免费提供在线观看| 在线观看亚洲视频啊啊啊啊| 日韩在线播放中文字幕| 久久亚洲影视| 欧美色图免费看| 欧美日韩一区综合| 国产性猛交╳xxx乱大交| 久久九九热re6这里有精品| 一级做a爱片久久| **亚洲第一综合导航网站| 强制高潮抽搐sm调教高h| 日韩不卡免费高清视频| 粉嫩aⅴ一区二区三区四区五区 | 国产精品久久久999| 国产极品一区二区| 免费看男女www网站入口在线 | 五月天丁香久久| 成人在线看片| 精品在线视频免费| 国产极品模特精品一二| 亚洲超丰满肉感bbw| 国产精品美女xx| 日韩aaaaaa| 日本国产精品| 日韩欧美一区电影| 午夜啪啪小视频| а天堂中文在线官网| 国产九色精品成人porny| 欧美大尺度在线观看| 性生活一级大片| h片在线观看| 91在线视频18| 国产精品美女午夜av| 国产稀缺精品盗摄盗拍| 中文在线免费一区三区| 884aa四虎影成人精品一区| 2021国产视频| 日本三级在线播放完整版| 久久久精品免费网站| 国产精品免费久久久| 国产精品久久久免费视频| 九九综合久久| 欧美日韩第一区日日骚| 欧美性猛交内射兽交老熟妇| 午夜性色福利视频| 免费观看成人av| 欧美丰满少妇xxxx| 中国美女乱淫免费看视频| 国产91在线播放精品| 悠悠色在线精品| 久久久久久国产精品一区| 国产精华7777777| 在线精品国产| 亚洲国产成人久久综合一区| 蜜桃免费在线视频| 91黄色在线| 亚洲激情一二三区| 人妻无码一区二区三区四区| 日本动漫同人动漫在线观看| 久久这里只有精品视频网| 国产精品久久久久久久久久小说| 秋霞av一区二区三区| 欧美影视一区| 一区二区国产精品视频| 亚洲欧美激情一区二区三区| 日韩免费福利视频| 色狠狠一区二区三区香蕉| 强开小嫩苞一区二区三区网站| 无码精品在线观看| 久久婷婷色综合| 天堂一区二区三区| 国产91免费看| 久久91精品国产91久久小草| 欧洲成人在线视频| 91黑人精品一区二区三区| 亚洲电影在线| 久久国产精品亚洲| 国产无遮挡aaa片爽爽| 国产精品女主播一区二区三区| 久久久久www| 久久美女免费视频| 色婷婷久久久| 亚洲第一精品久久忘忧草社区| 中文视频在线观看| 久久久久毛片免费观看| 欧美色成人综合| 欧美精品 - 色网| 国模套图日韩精品一区二区| 秋霞影院一区二区| 91精品国产91久久久久福利| 欧美日韩人妻精品一区二区三区| 第一会所亚洲原创| 亚洲人成电影网站色| xxxx黄色片| 不卡日本视频| 国模精品系列视频| 国产精品suv一区二区| 久久久久免费| 日本中文字幕久久看| 国产又黄又爽又色| 国产一区二区在线免费观看| 国产精品久久久久久av下载红粉| www.黄色片| 国产成人av电影| 水蜜桃一区二区三区| 丰满的护士2在线观看高清| 亚洲一级二级三级| 91黄色在线看| 91色在线看| 欧美美女bb生活片| 国内av免费观看| 国产欧美高清视频在线| 日韩网站在线观看| 26uuu成人网| 久久久亚洲一区| 奇米四色中文综合久久| 性一交一乱一色一视频麻豆| 成人性生交大片免费看中文| 国产精品伊人日日| 欧美69xxxx| 亚洲欧美一区二区三区极速播放 | 黄网站免费在线播放| 日韩一区欧美一区| 一级黄色录像免费看| 黄色av网站在线播放| 一本色道久久综合亚洲91| 国产熟人av一二三区| 成人精品高清在线视频| 日韩精品在线免费观看| 国产成人一区二区在线观看| 日韩欧美视频在线播放| 久久五月天综合| 久久无码精品丰满人妻| 亚洲一区二区动漫| 国产精品我不卡| 在线免费观看污| 91精品蜜臀在线一区尤物| 亚洲精品国产精品乱码在线观看| 欧美 日韩 国产 一区| 国产精品91久久久| 国产ts变态重口人妖hd| 99国产精品久久久| 久久久久久久久久网| japanese23hdxxxx日韩| 日韩国产一区三区| 日韩一卡二卡在线观看| 免费观看成人av| 一区二区精品视频| 爱搞国产精品| 欧美乱妇23p| 亚洲 小说 欧美 激情 另类| 影音先锋日韩在线| 91在线|亚洲| 精品999视频| 亚洲黄网站在线观看| 91人妻一区二区三区| 欧美黄色一级视频| 国产在线精品一区| 午夜视频在线看| 欧美精品自拍偷拍| 麻豆疯狂做受xxxx高潮视频| 美女视频黄a大片欧美| 宅男在线精品国产免费观看| 清纯唯美激情亚洲| 中文字幕亚洲精品| 日韩黄色在线播放| 国产欧美一区二区三区沐欲| 欧美视频在线观看网站| 日韩精品免费一区二区夜夜嗨 | 青青草影院在线观看| 6080亚洲理论片在线观看| 91av在线免费观看| freemovies性欧美| 黑人精品xxx一区一二区| 色哟哟免费视频| 亚洲另类视频| 成人久久18免费网站漫画| 中文字幕日本在线观看| 欧美午夜xxx| 精品人妻在线视频| 在线中文字幕亚洲| 韩国成人一区| 牛牛电影国产一区二区| 日韩成人在线免费观看| 无码人妻丰满熟妇区bbbbxxxx| 国产精品乱码妇女bbbb| 一级黄色免费视频| 麻豆免费看一区二区三区| 农村寡妇一区二区三区| 波多野在线观看| 亚洲最新视频在线| 亚洲精品一区二区三区区别| 日本韩国一区二区三区视频| 玖玖爱免费视频| 国产亚洲一区二区三区在线观看 | 二区在线播放| 国产视频在线观看一区二区| 国产哺乳奶水91在线播放| 91成人免费电影| 女人黄色一级片| 日日骚欧美日韩| 视频在线99re| 丁香一区二区| 亚洲自拍中文字幕| 国产黄色在线免费观看| 亚洲人成77777在线观看网| 成人久久精品人妻一区二区三区| 欧美网站一区二区| 成年人网站在线观看视频| 99精品热视频| 日本50路肥熟bbw| 国产一区二区日韩精品| 污片在线免费看| 久久精品国产清高在天天线| 国产免费黄色小视频| 亚洲一级一区| 特大黑人娇小亚洲女mp4| 久久一区二区三区喷水| 五月天综合网| 精品亚洲成人| 91免费视频国产| 国产精品毛片久久久久久久久久99999999| 在线观看日韩视频| 男人久久精品| 欧美日韩精品三区| 成人免费毛片视频| 日韩欧美a级成人黄色| 色网站在线播放| 中文字幕成人av| 妖精视频在线观看| 黑人巨大精品欧美一区| 国产主播自拍av| 国产精品亚洲片在线播放| 精品免费国产| 日韩影视在线观看| 久久久福利视频| 天海翼精品一区二区三区| 久久av二区| 亚洲综合图色| 亚洲一区制服诱惑| 久久精品一级| 成人欧美一区二区三区视频| 成人激情自拍| 国产精品私拍pans大尺度在线| 中文字幕伦理免费在线视频| 久久久av一区| 中文字幕在线观看网站| 欧美激情国产高清| 波多野一区二区| 日本欧美在线视频| 亚洲四虎影院| 成人精品久久久| 一区二区三区四区日本视频| 555www成人网| 韩国成人在线| 91在线中文字幕| **爰片久久毛片| 好看的日韩精品视频在线| 亚洲自拍电影| 大地资源第二页在线观看高清版| 欧美在线免费| 老太脱裤让老头玩ⅹxxxx| 免费欧美日韩| 九色porny自拍| 久久久精品五月天| 日本中文字幕高清| 夜夜嗨一区二区三区| 米仓穗香在线观看| 91久久亚洲| 9久久婷婷国产综合精品性色| 激情国产一区二区| 国产成人av无码精品| 欧美经典一区二区三区| 日本青青草视频| 精品久久久久久久久久久| 亚洲精品一区二区二区| 日韩精品一区二区三区在线播放| 青青九九免费视频在线| 精品久久一二三区| 国产丝袜视频在线观看| 欧美色国产精品| 黄色三级网站在线观看| 亚洲视频精品在线| 亚洲wwwww| 欧美大尺度在线观看| 一区二区三区电影大全| 亚洲综合在线播放| 嫩草影视亚洲| 成人短视频在线观看免费| 水野朝阳av一区二区三区| 古装做爰无遮挡三级聊斋艳谭| 久久久影视传媒| 日本青青草视频| 欧美亚洲综合一区| 日韩一级片免费看| 精品国产一区二区在线观看| www.黄色片| 在线观看欧美日韩| 成人性生交大片免费看网站 | 中文字幕日韩精品在线观看| а√天堂8资源在线| 91亚洲精品一区| 精品日本12videosex| 欧美黑人经典片免费观看| 狠狠色丁香久久婷婷综合_中| 欧美特黄一区二区三区| 夜夜操天天操亚洲| 97人妻精品一区二区三区| 欧美丰满嫩嫩电影| 久久久久久久影视| 久久久综合免费视频| 2020国产精品小视频| 91黄在线观看| 日韩中文在线电影| av网址在线观看免费| 久久午夜av| 国产麻豆xxxvideo实拍| 亚洲最大成人网4388xx| 国产精品视频第一页| 色老头一区二区三区| www在线观看播放免费视频日本| 国产97在线播放| 亚洲美女久久| 国产白丝袜美女久久久久| 爽好多水快深点欧美视频| 国产精品久久久久久亚洲av| 一级做a爱片久久| 亚洲精品18在线观看| 久久99精品视频一区97| 欧美羞羞视频| 久久国产一区二区| 国产精品三上| 一起草在线视频| 懂色av中文一区二区三区天美| 色婷婷在线视频| 国产一区二区精品丝袜| 毛片av在线| 国产主播精品在线| 草草视频在线一区二区| 17c丨国产丨精品视频| 久久国产99| 国产精品无码一区二区三区免费| 国产日本欧洲亚洲| 男人天堂2024| 亚洲一区二区久久久| 另类一区二区| 成人看片在线| 伊人影院久久| 久久一区二区电影| 色综合久久精品| 9191在线| 91偷拍精品一区二区三区| 禁久久精品乱码| 人人妻人人藻人人爽欧美一区| 色天天综合色天天久久| 日日夜夜精品一区| 99精品国产一区二区| 中文亚洲欧美| 卡一卡二卡三在线观看| 在线91免费看| 黄毛片在线观看| 日韩欧美视频一区二区| 国内精品亚洲| 最新中文字幕2018| 中文字幕亚洲精品在线观看| 亚洲AV无码精品色毛片浪潮| 海角国产乱辈乱精品视频| 香蕉视频亚洲一级| 一本一道久久a久久精品综合| 国产成人综合在线观看| 国产一级淫片久久久片a级| 红桃av永久久久| 国产在线色视频| 91在线精品播放| 在线日韩电影| 国产三级黄色片| 欧美xxxxxxxx| 日韩制服一区| 久久这里只有精品18| 久久久综合精品| www.黄色国产| 国产精品一区久久| 亚洲激情视频| 国产日产在线观看| 亚洲精品白浆高清久久久久久|