成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一個小小的JavaScript題目

zzbo / 390人閱讀

摘要:先解釋一下第三個,這個也很簡單,因為用了所以實際匹配了顯示綁定,所以當前綁定了那么輸出的肯定是??梢娔悴恢赖倪@本書說的很對,之所以會在出現(xiàn)箭頭函數(shù),實質(zhì)就像用詞法作用域代替因為這個真的特別特別容易誤用和讓人誤解。

 今天前Leader在下班前發(fā)給我一道JavaScript的題目,看到感覺很不錯,而且我開始的時候確實也理解錯了,覺得有必要拿出來講講,并且為此我也做錯了地鐵,哈哈哈~
  題目是這樣的:

var length = 10;
function fn() {
    console.log(this.length)
};
var obj = {
    length: 5, 
    method: function (fn) {
        fn();
        arguments[0]();
        fn.call(obj, 12);
    }
};
obj.method(fn, 1);

  請問輸出是什么,當時那手機看的時候給出了答案

10 10 5

  實際上并不是如此,答案是:

10 2 5

  仔細分析了一下才知道原因,首先介紹一下四種this的類型:

默認綁定

隱式綁定

顯示綁定

new綁定

其中,默認綁定就是什么都匹配不到的情況下,非嚴格模式this綁定到全局對象window或者global,嚴格模式綁定到undefined;隱式綁定就是函數(shù)作為對象的屬性,通過對象屬性的方式調(diào)用,這個時候this綁定到對象;顯示綁定就是通過applycall調(diào)用的方式;new綁定就是通過new操作符時將this綁定到當前新創(chuàng)建的對象中,它們的匹配有限是是從小到大的。
  那么現(xiàn)在來解釋一下:

obj.method(fn, 1);

  上述執(zhí)行其實對應的是下面三條語句:

fn(); 
arguments[0]();
fn.call(obj, 12);

  通過將函數(shù)賦值給函數(shù)參數(shù)(fn),然后調(diào)用fn,這個時候能匹配到的this類型就是第一條默認綁定,因為實在非嚴格模式下,所以this綁定的是window,當然首先輸出的是10。
  先解釋一下第三個,這個也很簡單,因為用了call,所以實際匹配了顯示綁定,所以當前this綁定了obj,那么輸出的肯定是2。
  下面著重解釋一下第二個,這個我當時理解成和第一次完全一樣,但實際并不是的,其實在JavaScript中數(shù)組算是一種特殊的對象(關于JavaScript對象的部分,我現(xiàn)在還在寫,下一篇就會出的),arguments[0]其實就是通過對象的屬性去調(diào)用(數(shù)組的默認屬性類型是數(shù)值而普通對象的屬性類型是字符串),那么現(xiàn)在其實運用的是規(guī)則2,this被綁定到arguments上,而arguments確實存在一個length屬性,并且值為2(這個別告訴我你看不出來),所以輸出的肯定就是2啦。
  可見《你不知道的JavaScript》這本書說的很對,之所以會在ES6出現(xiàn)箭頭函數(shù),實質(zhì)就像用詞法作用域代替this,因為這個真的特別特別容易誤用和讓人誤解。
  歡迎大家到我的個人博客看看,https://mrerhu.github.io ?

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86725.html

相關文章

  • 一道小小題目引發(fā)對javascript支持正則表達式相關方法探討

    摘要:返回值返回值根據(jù)傳入的參數(shù)類型和規(guī)則的不同,返回的內(nèi)容不同,但總體來說,它是返回一個對象,而不是索引,如果沒匹配到任何符合條件的字符串,則返回。 本文發(fā)布在我的博客一道小小的題目引發(fā)對javascript支持正則表達式相關方法的探討許可協(xié)議: 署名-非商業(yè)性使用-禁止演繹 4.0 國際 轉(zhuǎn)載請保留原文鏈接及作者。 以前對于正則是非常懼怕的,因為看不懂和學不會。但最近項目中頻繁的...

    Scholer 評論0 收藏0
  • 從一道面試題談談函數(shù)柯里化(Currying)

    摘要:忍者秘籍一書中,對于柯里化的定義如下在一個函數(shù)中首先填充幾個參數(shù)然后再返回一個新函數(shù)的技術稱為柯里化?;氐轿覀兊念}目本身,其實根據(jù)測試用例我們可以發(fā)現(xiàn),函數(shù)的要求就是接受單一函數(shù),例如但是與柯里化不同之處在于,柯里化返回的一個新函數(shù)。   歡迎大家再一次來到我的文章專欄:從面試題中我們能學到什么,各位同行小伙伴是否已經(jīng)開始了悠閑的春節(jié)假期呢?在這里提前祝大家雞年大吉吧~哈哈,之前有人說...

    cppprimer 評論0 收藏0
  • 前端經(jīng)典文章

    摘要:上周末看這篇文章時,偶有靈光,所以,分享出來給大家一起看看前端面試四月二十家前端面試題分享請各位讀者添加一下作者的微信公眾號,以后有新的文章,將在微信公眾號直接推送給各位,非常感謝。 前端切圖神器 avocode 有了這個神器,切圖再也腰不酸,腿不疼了。 這一次,徹底弄懂 JavaScript 執(zhí)行機制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機制,如果讀完本文還不懂,...

    lowett 評論0 收藏0
  • 前端系列——查找字符串B字符任意一種組合是否是字符串A子串

    摘要:例如,,則的其中一種組合是的子串,然后返回。如果從題目給出的例子來窮舉,一共種組合,很容易窮舉出來,但是字符串長度非常大的時候,怎么辦呢所以,窮舉的辦法被我排除了。 題目要求 這道算法題在前端面試中可能遇到,據(jù)說某條出過這題。 查找字符串B的字符任意一種組合是否是字符串A的子串。例如 A=abc123,B=cba,則B的其中一種組合abc是A的子串,然后返回true。 算法思路 題目的...

    zengdongbao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<