欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

原生js代碼能實(shí)現(xiàn)call和bind嗎

 更新時(shí)間:2019年07月31日 15:05:59   作者:前端前端前端  
這篇文章主要介紹了原生js代碼能實(shí)現(xiàn)call和bind嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

js手動(dòng)實(shí)現(xiàn)call和bind都是謊言

網(wǎng)上有很多關(guān)于說(shuō)自己實(shí)現(xiàn)call和bind的原理的文章,然而call和bind的原理真如他們所說(shuō)的那樣嗎?今天就讓我來(lái)推翻這些所謂的”原理“,揭開(kāi)謊言下的真相。

首先看看網(wǎng)上對(duì)call的實(shí)現(xiàn):

// 手寫(xiě) call
Function.prototype.mycall = function (context) {
  context = context || window;
  context.fn = this;
  const args = [...arguments].slice(1);
  const result = context.fn(...args);
  // 執(zhí)行fn時(shí)上下文context已被修改,不是我們所期望的call 
  delete context.fn;
  return result;
}
function show() {
  console.log(this);
}
show.mycall({haha:122});

以上代碼的執(zhí)行結(jié)果是

如你所見(jiàn),這樣實(shí)現(xiàn)的call并不是我們所期望的那樣。

對(duì)比于函數(shù)自帶的call:

show.call({haha:122})

其結(jié)果為

分析其原因不難發(fā)現(xiàn),根據(jù)函數(shù)mycall,執(zhí)行context.fn(...args)之前修改了上下文context,所以執(zhí)行fn時(shí)所使用的上下文是修改后的上下文,導(dǎo)致與預(yù)期結(jié)果相差甚遠(yuǎn)。

核心

而且,往更深的層次去思考,call絕不是這樣(或類(lèi)似這樣)實(shí)現(xiàn)的,call是底層語(yǔ)言為瀏覽器封裝好的函數(shù),是絕對(duì)不能也沒(méi)必要用js強(qiáng)行模仿的。

綜上,js模仿call和bind絕對(duì)沒(méi)有g(shù)et到底層原理,這樣的模仿只能用于娛樂(lè)而已,沒(méi)有實(shí)際價(jià)值。bind和call類(lèi)似,這里就不贅述了。

相關(guān)文章

  • JS判斷當(dāng)前是否平板安卓并是否支持cordova方法的示例代碼

    JS判斷當(dāng)前是否平板安卓并是否支持cordova方法的示例代碼

    這篇文章主要介紹了JS判斷當(dāng)前是否平板安卓并是否支持cordova方法,pc和安卓平板共用一套代碼,平板的代碼用了cordova做了一個(gè)殼子嵌套如果用了cordova就不支持elementUI中的上傳功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • js 動(dòng)態(tài)加載事件的幾種方法總結(jié)

    js 動(dòng)態(tài)加載事件的幾種方法總結(jié)

    本篇文章主要是對(duì)js 動(dòng)態(tài)加載事件的幾種方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • JavaScript面向?qū)ο缶幊绦∮螒?--貪吃蛇代碼實(shí)例

    JavaScript面向?qū)ο缶幊绦∮螒?--貪吃蛇代碼實(shí)例

    這篇文章主要介紹了JavaScript貪吃蛇的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 微信小程序入口場(chǎng)景的問(wèn)題集合與相關(guān)解決方法

    微信小程序入口場(chǎng)景的問(wèn)題集合與相關(guān)解決方法

    這篇文章主要介紹了微信小程序入口場(chǎng)景的問(wèn)題集合與相關(guān)解決方法,從零開(kāi)始開(kāi)發(fā)一個(gè)小程序,大多數(shù)坑點(diǎn)都是在微信小程序的各個(gè)入口場(chǎng)景處。所以這里整理一下微信小程序的各個(gè)入口場(chǎng)景會(huì)面臨的問(wèn)題以及解決方案,需要的朋友可以參考下
    2019-06-06
  • ajax如何實(shí)現(xiàn)頁(yè)面局部跳轉(zhuǎn)與結(jié)果返回

    ajax如何實(shí)現(xiàn)頁(yè)面局部跳轉(zhuǎn)與結(jié)果返回

    AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開(kāi)發(fā)技術(shù),通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新,本篇文章給大家介紹ajax如何實(shí)現(xiàn)頁(yè)面局部跳轉(zhuǎn)與結(jié)果返回,感興趣的朋友一起來(lái)學(xué)習(xí)
    2015-08-08
  • Django1.7+JQuery+Ajax驗(yàn)證用戶(hù)注冊(cè)集成小例子

    Django1.7+JQuery+Ajax驗(yàn)證用戶(hù)注冊(cè)集成小例子

    下面是散仙使用Django+Jquery+Ajax的方式來(lái)模擬實(shí)現(xiàn)了一個(gè)驗(yàn)證用戶(hù)注冊(cè)時(shí),用戶(hù)名存在不存在的一個(gè)小應(yīng)用。注意,驗(yàn)證存在不存在使用的是Ajax的方式,不用讓用戶(hù)點(diǎn)擊按鈕驗(yàn)證是否存在,需要的朋友可以參考下
    2017-04-04
  • style、 currentStyle、 runtimeStyle區(qū)別分析

    style、 currentStyle、 runtimeStyle區(qū)別分析

    style、 currentStyle、 runtimeStyle區(qū)別分析,需要的朋友可以參考下。
    2010-08-08
  • javascript實(shí)現(xiàn)阻止iOS APP中的鏈接打開(kāi)Safari瀏覽器

    javascript實(shí)現(xiàn)阻止iOS APP中的鏈接打開(kāi)Safari瀏覽器

    這篇文章主要介紹了javascript實(shí)現(xiàn)阻止iOS APP中的鏈接打開(kāi)Safari瀏覽器,這個(gè)IOS APP一般是Web APP,否則沒(méi)法使用本文的代碼,需要的朋友可以參考下
    2014-06-06
  • JS顯示表格內(nèi)指定行html代碼的方法

    JS顯示表格內(nèi)指定行html代碼的方法

    這篇文章主要介紹了JS顯示表格內(nèi)指定行html代碼的方法,涉及javascript獲取行及innerHTML屬性的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • javascript dom 操作詳解 js加強(qiáng)

    javascript dom 操作詳解 js加強(qiáng)

    javascript dom 操作詳解 js加強(qiáng)操作實(shí)現(xiàn)代碼。
    2009-07-07

最新評(píng)論