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

資訊專欄INFORMATION COLUMN

javascript function 聲明及編譯執(zhí)行順序Tips

wpw / 2208人閱讀

摘要:因?yàn)閴K中只能包含語句,而不能包含函數(shù)聲明這樣的源元素。但是,規(guī)范明確規(guī)定了表達(dá)式語句不能以關(guān)鍵字開頭。所以我們代碼中的是在中只能被視為函數(shù)表達(dá)式,而不是函數(shù)聲明,不會(huì)被提前編譯解析。

今天在學(xué)習(xí) 前端工程師手冊(cè) > 關(guān)于函數(shù) 章節(jié)時(shí)收獲一點(diǎn)點(diǎn)知識(shí),做個(gè)記錄并分享一下。
我們先從看兩段代碼,再來分析。
代碼1:

    function foo() { return 1; }
    var foo = function() { return 2; }
    foo(); //結(jié)果是 2

代碼2:

    var foo = function(){ return 2;}
    function foo() { return 1; }
    foo(); //結(jié)果是 2

*知識(shí)點(diǎn):在當(dāng)前作用域下,函數(shù)聲明會(huì)被最先提前被編譯執(zhí)行,如本文:function foo(){}

所以上面代碼類似于:

代碼1:

    function foo() { return 1; }
    var foo = function() { return 2; }
    foo();
     
    ↓↓ (編譯后)
    
    var foo = function() { return 1; }
    foo = function() { return 2; }
    foo(); 

代碼2:

    var foo = function() { return 2; }
    function foo() { return 1; }
    foo(); 
     
    ↓↓ (編譯后)
    
    var foo = function(){return 1;}//function foo() { return 1; }被提到最前面了
    foo = function(){return 2;}
    foo(); 

再來看另一種情況:

    if (true) {
        function foo() { return 1; }
    }
    function foo() { return 2; }
    foo(); //結(jié)果 1

我們還是按照上面邏輯進(jìn)行解讀:

    if (true) {
        function foo() { return 1; }
    }
    function foo() { return 2; }
    foo(); 
    
    ↓↓ (編譯后)
    
    var foo = function () { return 2; }
    if (true) {
        var foo = function () { return 1; }
    }
    foo(); 

可能有人會(huì)疑問:為什么function foo () { return 1; } 沒有被提前呢?

因?yàn)楹瘮?shù)聲明只能出現(xiàn)在程序或函數(shù)體內(nèi)。從句法上講,它們 不能出現(xiàn)在Block(塊)({ ... })中,例如不能出現(xiàn)在 if、while 或for 語句中。因?yàn)?Block(塊) 中只能包含Statement語句,
而不能包含函數(shù)聲明這樣的源元素。另一方面,仔細(xì)看一看規(guī)則也會(huì)發(fā)現(xiàn),唯一可能讓表達(dá)式出現(xiàn)在Block(塊)中情形,就是讓它作為表達(dá)式語句的一部分。但是,規(guī)范明確規(guī)定了表達(dá)式語句不能以關(guān)鍵字function開頭。而這實(shí)際上就是說,函數(shù)表達(dá)式同樣也不能出現(xiàn)在Statement語句或Block(塊)中(因?yàn)锽lock(塊)就是由Statement語句構(gòu)成的)。

所以我們代碼中的function foo () { return 1; } 是在if中,只能被視為函數(shù)表達(dá)式,而不是函數(shù)聲明,不會(huì)被提前編譯解析。

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

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

相關(guān)文章

  • js預(yù)編譯過程

    摘要:所以變量聲明提升和函數(shù)聲明提升會(huì)出現(xiàn)一個(gè)先后順序預(yù)編譯過程結(jié)束。 先科普: 1.javaScript是解釋型語言,就是編譯一行,執(zhí)行一行.....2.javaScript沒有塊級(jí)及作用域......3.javaScript具有變量和函數(shù)聲明提升功能.....4.AO對(duì)象和GO對(duì)象....5.預(yù)編譯就是解決代碼執(zhí)行順序問題,與java語言類似(jvm).... 例如: (function...

    FWHeart 評(píng)論0 收藏0
  • JavaScript 工作原理之三-內(nèi)存管理如何處理 4 類常見的內(nèi)存泄漏問題(譯)

    摘要:這是因?yàn)槲覀冊(cè)L問了數(shù)組中不存在的數(shù)組元素它超過了最后一個(gè)實(shí)際分配到內(nèi)存的數(shù)組元素字節(jié),并且有可能會(huì)讀取或者覆寫的位。包含個(gè)元素的新數(shù)組由和數(shù)組元素所組成中的內(nèi)存使用中使用分配的內(nèi)存主要指的是內(nèi)存讀寫。 原文請(qǐng)查閱這里,本文有進(jìn)行刪減,文后增了些經(jīng)驗(yàn)總結(jié)。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 這是 JavaScript 工作原理的第三章。 我們將會(huì)討論日常使用中另一個(gè)被開發(fā)...

    weknow619 評(píng)論0 收藏0
  • JavaScript中的執(zhí)行上下文和變量對(duì)象

    摘要:以上簡(jiǎn)單總結(jié)了下對(duì)執(zhí)行上下文和變量對(duì)象的理解,主要在于記錄總結(jié)一下學(xué)習(xí)成果,目前文章的水平實(shí)在不敢談分享。 執(zhí)行上下文(Execution Context) 文章同步到github javaScript中的執(zhí)行上下文和變量對(duì)象 JavaScript代碼執(zhí)行的過程,包括編譯和執(zhí)行兩個(gè)階段,編譯就是通過詞法分析,構(gòu)建抽象抽象語法樹,并編譯成機(jī)器識(shí)別的指令,在JavaScript代碼編譯階段...

    why_rookie 評(píng)論0 收藏0
  • 讀書筆記(05) - 事件 - JavaScript高級(jí)程序設(shè)計(jì)

    摘要:而事件分為個(gè)級(jí)別級(jí)事件處理程序,級(jí)事件處理程序和級(jí)事件處理程序。級(jí)中沒有規(guī)范事件的相關(guān)內(nèi)容,所以沒有級(jí)事件處理。 showImg(https://segmentfault.com/img/bVburYR?w=499&h=400); HTML依托于JavaScript來實(shí)現(xiàn)用戶與WEB網(wǎng)頁之間的動(dòng)態(tài)交互,接收用戶操作并做出相應(yīng)的反饋,而事件在此間則充當(dāng)橋梁的重要角色。 日常開發(fā)中,經(jīng)常會(huì)...

    tinylcy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<