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