亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

wpw / 2243人閱讀

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

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

*知識點(diǎn):在當(dāng)前作用域下,函數(shù)聲明會被最先提前被編譯執(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(); 

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

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

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

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

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

相關(guān)文章

  • js預(yù)編譯過程

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

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

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

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

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

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

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

    tinylcy 評論0 收藏0

發(fā)表評論

0條評論

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