JavaScript中函數聲明提升

    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');
        }
    }

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

a
undefined
Uncaught TypeError: c is not a function

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

a
undefined
c

函數聲明提升的解釋

在MDN中對于函數的描述

MDN上對于函數聲明提升的例子

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

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

對于函數聲明和函數表達式的區別:


函數聲明和函數表達式區別

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

頂部代碼在經過解析之后的順序是:

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

歡迎斧正

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容