亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

大家好,我是你們的導(dǎo)師,我每天都會在這里給大家分享一些干貨內(nèi)容(當(dāng)然了,周末也要允許老師休息一下哈)。昨天給大家分享了JAVAScript的閉包,今天給大家分享一下call和Apply的模擬實現(xiàn)。

 

1. call函數(shù)

 

一句話介紹 call:call() 方法在使用一個指定的 this 值和若干個指定的參數(shù)值的前提下調(diào)用某個函數(shù)或方法。舉個例子:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

注意兩點:

 

1)call 改變了 this 的指向,指向到 foo;

2)bar 函數(shù)執(zhí)行了

 

2. 模擬實現(xiàn)第一步

 

那么我們該怎么模擬實現(xiàn)這兩個效果呢?試想當(dāng)調(diào)用 call 的時候,把 foo 對象改造成如下:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

這個時候 this 就指向了 foo,是不是很簡單呢?但是這樣卻給 foo 對象本身添加了一個屬性,這可不行吶!不過也不用擔(dān)心,我們用 delete 再刪除它不就好了。所以我們模擬的步驟可以分為:

 

1)將函數(shù)設(shè)為對象的屬性

2)執(zhí)行該函數(shù)

3)刪除該函數(shù)

 

以上個例子為例,就是:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

fn 是對象的屬性名,反正最后也要刪除它,所以起成什么都無所謂。根據(jù)這個思路,我們可以嘗試著去寫第一版的 call2 函數(shù):

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

3. 模擬實現(xiàn)第二步

 

最一開始也講了,call 函數(shù)還能給定參數(shù)執(zhí)行函數(shù)。舉個例子:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

注意:傳入的參數(shù)并不確定,這可咋辦?不急,我們可以從 Arguments 對象中取值,取出第二個到最后一個參數(shù),然后放到一個數(shù)組里。比如這樣:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

不定長的參數(shù)問題解決了,我們接著要把這個參數(shù)數(shù)組放到要執(zhí)行的函數(shù)的參數(shù)里面去。

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

也許有人想到用 ES6 的方法,不過 call 是 ES3 的方法,我們?yōu)榱四M實現(xiàn)一個 ES3 的方法,要用到ES6的方法,好像……,嗯,也可以啦。但是我們這次用 eval 方法拼成一個函數(shù),類似于這樣:

 

eval('context.fn(' + args +')')

 

這里 args 會自動調(diào)用 Array.toString() 這個方法。所以我們的第二版克服了兩個大問題,代碼如下:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

4. 模擬實現(xiàn)第三步

 

模擬代碼已經(jīng)完成 80%,還有兩個小點要注意:

 

1)this 參數(shù)可以傳 null,當(dāng)為 null 的時候,視為指向 window,舉個例子:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

雖然這個例子本身不使用 call,結(jié)果依然一樣。

 

2)函數(shù)是可以有返回值的!舉個例子:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

不過都很好解決,讓我們直接看第三版也就是最后一版的代碼:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

到此,我們完成了 call 的模擬實現(xiàn)。

 

5. apply的模擬實現(xiàn)

 

apply 的實現(xiàn)跟 call 類似,在這里直接給代碼:

 

JavaScript之call和apply的模擬實現(xiàn)

 

 

今天就分享到這,如果覺得對你有一丟丟幫助,請點擊【收藏評論】,讓更多人看到該文章。大家也可以在底部給我留言,對于有價值的留言,我們都會一一回復(fù)的。

分享到:
標(biāo)簽:JavaScript
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定