JavaScript中函數(shù)聲明提升

    a(); // => a
    console.log(b); // => undefined
    function a() {
        console.log('a');
    }
    var b = 'b';
    c(); // => Uncaught TypeError: c is not a function
    if (true) {
        function c() {
            console.log('c');
        }
    }

運行結(jié)果:(chrome 54.0+、IE11)

a
undefined
Uncaught TypeError: c is not a function

js中變量聲明和函數(shù)聲明會在解析的時候提升【參考MDN變量提升】。但是為什么if(true)...語句后邊的函數(shù)沒有被提前呢?這和很多其他的博客中描述的完全不一樣。依據(jù)其他博主的博客中描述輸出的結(jié)果應(yīng)該是:

a
undefined
c

函數(shù)聲明提升的解釋

在MDN中對于函數(shù)的描述

MDN上對于函數(shù)聲明提升的例子

即,通過函數(shù)聲明定義的函數(shù),在解析時會被提升;而通過函數(shù)表達式定義的函數(shù)不會被解析,只會在運行時解析(執(zhí)行到此處)。

MDN中有提到原因:函數(shù)表達式定義的函數(shù)繼承了當前的作用域。換言之,函數(shù)構(gòu)成了閉包。

對于函數(shù)聲明和函數(shù)表達式的區(qū)別:


函數(shù)聲明和函數(shù)表達式區(qū)別

由此,上邊代碼的if(true)...中函數(shù)部分因為屬于函數(shù)表達式定義的函數(shù),所以在開始解析的時候并不會被提升到外部作用域,所以c()得到的結(jié)果是錯誤Uncaught TypeError: c is not a function

頂部代碼在經(jīng)過解析之后的順序是:

    function a() {
        console.log('a');
    }
    var b;
    a();
    console.log(b);
    b = 'b';
    c();
    if (true) {
        function c() {
            console.log('c');
        }
    }

歡迎斧正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容