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');
}
}
歡迎斧正