精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲高清av在线| 国产精品美女一区二区| 欧美一性一乱一交一视频| 无码少妇一区二区| 高清国产一区二区三区四区五区| 一个色在线综合| 亚洲国产精品悠悠久久琪琪| 成年人视频网站免费观看| bbbbbbbbbbb在线视频| 国产乱码一区二区三区| 5566日本婷婷色中文字幕97| 久久噜噜色综合一区二区| 福利在线一区| 欧美日本一区二区| 国产精品国产亚洲精品看不卡| av资源网站在线观看| 福利视频网站一区二区三区| 国产精品久久久久秋霞鲁丝 | 一区二区在线免费播放| 欧美日韩国产精品一区二区三区四区 | 日本人妻伦在线中文字幕| 色资源在线观看| 高清在线不卡av| 成人做爽爽免费视频| 国产精品久久久久久久久久精爆| 欧美久久99| 日日摸夜夜添一区| 小早川怜子久久精品中文字幕| 韩国一区二区三区视频| 欧美性受极品xxxx喷水| www.com毛片| gogo久久| 亚洲黄色尤物视频| 国产奶头好大揉着好爽视频| 你懂的在线网址| 99国产精品一区| 成人免费在线看片| 国产黄色小视频在线观看| 久久成人精品无人区| 国产成人精品免高潮在线观看| 国产在线精品观看| 欧美精品成人| 久久九九全国免费精品观看| 国产毛片欧美毛片久久久| 亚洲人亚洲人色久| 亚洲精品国产拍免费91在线| 国产一精品一aⅴ一免费| 精品国产亚洲一区二区三区在线 | 色综合久久精品亚洲国产| 日本一级片免费| 成人在线免费小视频| 亚洲色无码播放| brazzers精品成人一区| 爽爽窝窝午夜精品一区二区| 日韩福利视频在线观看| 男男做爰猛烈叫床爽爽小说| 国产精品巨作av| 精品国产乱码久久久久久牛牛| 亚洲熟女乱综合一区二区| 欧美.com| 精品免费一区二区三区| 美女伦理水蜜桃4| 97品白浆高清久久久久久| 精品国产一区二区三区不卡| 性一交一黄一片| silk一区二区三区精品视频| 亚洲精品一区二区三区精华液| 中国黄色片视频| 天堂av一区二区三区在线播放| 国产丝袜视频一区| 国产午夜精品福利视频| 欧美国产一级| 欧美巨猛xxxx猛交黑人97人| 九九热精品免费视频| 亚洲乱码视频| 亚洲国产美女精品久久久久∴| 天堂www中文在线资源| 日韩美女国产精品| 在线视频日韩精品| 亚洲国产成人精品综合99| 欧美午夜一区二区福利视频| 91av在线播放| 在线观看国产成人| 国产99久久久国产精品| 欧美日韩亚洲免费| 国产一二三区在线观看| 亚洲不卡av一区二区三区| 黄色片一级视频| 在线视频成人| 亚洲国产日韩欧美综合久久 | 思热99re视热频这里只精品| 亚洲一区av在线播放| 日本a级片视频| 香蕉成人久久| 亚洲最大福利网| 污污网站在线免费观看| 国产日韩欧美a| 又大又硬又爽免费视频| 日韩一区二区三区在线免费观看 | 欧美一区二区三| 久久99久国产精品黄毛片入口| 狠狠躁夜夜躁人人爽天天高潮| 日产国产高清一区二区三区| 懂色av一区二区三区在线播放| 男人久久精品| 亚洲尤物视频在线| 三上悠亚在线一区二区| 精品中国亚洲| 久久成人一区二区| 国产又粗又猛又爽又| 国产风韵犹存在线视精品| 日日夜夜精品网站| 91超碰在线播放| 91精品国产福利在线观看 | 国产精品视频在线观看免费| 91亚洲精品久久久蜜桃| 中文字幕乱码免费| ww久久综合久中文字幕| 日韩大片在线观看视频| 91传媒免费观看| 男女男精品视频网| 欧美成人蜜桃| segui88久久综合9999| 欧美精品1区2区3区| 亚欧洲乱码视频| 宅男噜噜噜66一区二区| 5566av亚洲| 日本在线人成| 欧美日韩免费观看一区二区三区| 大地资源二中文在线影视观看| 亚洲欧美亚洲| 91免费人成网站在线观看18| h视频在线免费| 色狠狠桃花综合| 国产精品无码一区二区三区免费| 国产精品豆花视频| 亚洲一区二区三区四区在线播放| 黄色片在线播放| 欧美午夜女人视频在线| 屁屁影院国产第一页| 欧美激情在线| 国产精品xxxx| av毛片在线播放| 欧美一级专区免费大片| 91麻豆精品成人一区二区| 美女尤物国产一区| 亚洲精品中文字幕在线| 视频精品导航| www.久久色.com| 日本一级片免费| 裸体在线国模精品偷拍| 亚洲成人午夜在线| 国产一区二区三区四区五区3d| 亚洲图中文字幕| 波多野结衣视频观看| 国产亚洲女人久久久久毛片| 欧美韩国日本在线| 精品国产一区二区三区噜噜噜| 欧美在线影院在线视频| 飘雪影院手机免费高清版在线观看| 午夜成人在线视频| 黄色aaa视频| 蜜臀91精品一区二区三区| 先锋在线资源一区二区三区| 日韩第二十一页| 欧美成人免费观看| 六月丁香色婷婷| 欧美日韩在线看| 手机毛片在线观看| 国产在线观看免费一区| 国产精品国产对白熟妇| 亚洲男人都懂第一日本| 国产精品视频一区国模私拍| 69久久夜色| 精品成a人在线观看| www亚洲视频| 中文字幕视频一区二区三区久| 国产精品熟女一区二区不卡| 亚洲麻豆av| 亚洲免费视频一区| 亚洲大奶少妇| 国产精品91在线| 精品自拍一区| 日韩激情片免费| 夜夜躁狠狠躁日日躁av| 亚洲午夜影视影院在线观看| 国产传媒第一页| 激情综合色播激情啊| 996这里只有精品| 国产精品免费大片| 99精品国产高清在线观看| 在线男人天堂| 美女999久久久精品视频| 色在线免费视频| 91精品国产欧美一区二区18| 丁香六月婷婷综合| 亚洲精品国产a| 韩国女同性做爰三级| 国产精品99久久久久久久vr| 国产综合免费视频| 国产一区二区中文| 污视频在线免费观看一区二区三区 | 香蕉视频xxxx| 日韩精品一二三| 日韩 欧美 视频| 国产精品传媒精东影业在线| 久久福利电影| 在线观看视频一区二区三区 | 无码人妻熟妇av又粗又大| 一区二区三区四区中文字幕| 性猛交娇小69hd| 成年人国产精品| 日本一二三区在线| 日韩不卡一区二区三区| 国产白丝袜美女久久久久| 国产精品国产一区| 青娱乐一区二区| 国产欧美啪啪| 亚洲最大成人在线| 亚洲一区二区av| 国产成人精品视| 最新中文字幕在线播放| 高清欧美一区二区三区| 国产网站在线免费观看| 中文字幕av一区| 国产三级视频在线看| 日韩av在线网| 国产极品999| 欧美一区二区三区婷婷月色| 五月激情丁香网| 色综合久久九月婷婷色综合| 日本一二三区不卡| 一区二区欧美视频| 欧美成人精品欧美一级| 综合久久给合久久狠狠狠97色| 亚洲自拍偷拍图| 久久久午夜电影| 国产精品伦子伦| 99久久精品免费精品国产| 免费啪视频在线观看| 国产美女精品一区二区三区| 不卡中文字幕在线观看| 久久超碰97中文字幕| 污视频网站观看| 美女视频第一区二区三区免费观看网站| 久久久久狠狠高潮亚洲精品| 久久精品官网| 日韩免费高清在线| 免费观看在线综合| 色一情一区二区| 激情图片小说一区| 五月天国产视频| 国产成人小视频| 国产精九九网站漫画| 99视频在线精品| 亚洲国产果冻传媒av在线观看| av高清不卡在线| 亚洲精品视频大全| 久久精品一区二区三区不卡| 国产在线观看h| 中文字幕av一区 二区| 国产精品18在线| 亚洲婷婷综合色高清在线| 欧美爱爱小视频| 天天综合网天天综合色| 无码人妻丰满熟妇精品| 欧美日韩在线播放| 国产精品久久免费| 精品剧情在线观看| 日韩亚洲视频在线观看| 国产一区二区日韩| av软件在线观看| 69av在线视频| 成人亚洲综合| 成人国产一区二区| 亚洲桃色综合影院| 一区精品在线| 伊人精品在线| 中文字幕第21页| 国产一区在线不卡| 波多野结衣影院| 国产精品色一区二区三区| 青娱乐国产在线视频| 欧美性xxxxxxx| 国产又大又粗又长| 日韩毛片在线看| 黄色小网站在线观看| 97碰碰碰免费色视频| 国产在线|日韩| 亚洲最大福利视频网| 久久av资源| 中文字幕欧美日韩在线| 欧美丰满熟妇xxxxx| 久热精品在线| 樱花草www在线| 久久在线免费观看| 91人妻一区二区三区蜜臀| 岛国av午夜精品| 国产三级三级在线观看| 亚洲欧美国产一本综合首页| 麻豆网站在线| 日本sm极度另类视频| 日韩成人久久| 色综合影院在线观看| 欧美视频久久| 911福利视频| 久久青草欧美一区二区三区| 免费中文字幕在线| 欧美视频在线观看一区| 性少妇videosexfreexxx片| 中文字幕免费精品一区高清| 国产拍在线视频| 不卡视频一区二区| 日韩欧美不卡| 国产三区在线视频| 成人中文字幕在线| 美国黄色小视频| 欧美日韩国产bt| 国产精品二线| 欧美一级片免费在线| 日韩精品一级| 日本三级福利片| 免费看黄色91| 中国女人特级毛片| 欧美日韩亚洲系列| 手机av在线免费观看| 欧美一区二区三区的| yjizz视频网站在线播放| 668精品在线视频| 草草视频在线一区二区| 五月天综合婷婷| 美国一区二区三区在线播放| 大黑人交xxx极品hd| 亚洲成精国产精品女| 99久久久久久久| 久久久国产精彩视频美女艺术照福利| 第四色男人最爱上成人网| 精品无人区一区二区三区| 亚洲国产精品一区制服丝袜| 久久久久久无码精品人妻一区二区| 国产精品久久久久久久久久免费看 | 一区二区美女| 久久综合九色综合88i| 成人国产在线观看| 精品无码人妻一区二区三区品| 日韩视频在线观看一区二区| 国产精品久久久久久福利| 国产一区二区在线免费| 97色伦图片97综合影院| 香港日本韩国三级网站| 国产精品视频看| 懂色av蜜臀av粉嫩av喷吹| 在线观看日韩av| 国产福利亚洲| 先锋影音男人资源| 国产精品亚洲第一区在线暖暖韩国 | 欧美激情精品久久久久久久变态| 欧美1区2区3| 一区视频在线播放| 韩国三级hd中文字幕| 在线观看免费成人| 1pondo在线播放免费| 国产一区二区在线播放| 在线电影一区二区| 四虎成人免费视频| 欧美日韩国产丝袜另类| 久久经典视频| 国产精品一区二区三区久久久| 91综合视频| 三上悠亚 电影| 欧美日韩一区二区在线| yiren22亚洲综合伊人22| 91欧美视频网站| 亚洲美女毛片| 亚洲黄色免费视频| 日韩一区二区三区免费观看| 国产后进白嫩翘臀在线观看视频| 久久国产精品-国产精品| 日韩电影在线免费观看| 黑人狂躁日本娇小| 欧美一级午夜免费电影| 不卡专区在线| 一区二区av| 成人免费不卡视频| 免费精品一区二区| 久久97久久97精品免视看| 最新精品国偷自产在线| 国产成人在线综合| 欧美日韩美女在线| 日韩三级影院| 99久久伊人久久99| 久久免费公开视频| 亚洲人成网站免费播放| a一区二区三区亚洲| 国产综合中文字幕| 国产精品第一页第二页第三页| www日本高清| 国产精品日韩在线一区| 欧美日韩网址| www..com.cn蕾丝视频在线观看免费版|