
var a = 0;if(true){a = 1;function a(){};a = 21;console.log(a);}console.log(a);// 21 1
當前上下文代碼執行之前,會將帶var/function的進行聲明/定義。
當遇到“{}”時,新版瀏覽器和老版瀏覽器的處理不一致。
老版瀏覽器(IE10以下)忽略“{}”的影響,繼續聲明/定義,不存在塊級作用域
新版瀏覽器中“{}”里的function只聲明不定義,“{}”若出現funciton/let/const關鍵字,會創建一個塊級上下文
本題在全局變量提升階段會聲明一個變量a,在塊級作用域內的function a同樣會聲明,但是不定義。 代碼繼續執行
var a = 0;
在全局下給a賦值0。
if(true){a = 1;function a(){};a = 21;console.log(a);}
代碼執行到條件判斷時,創建一個塊級作用域,在塊級作用域內進行變量提升,聲明并且定義funciton a。
a = 1;
塊級作用域內給a賦值為1。
繼續執行到函數定義的地方為了兼容ES3和ES6瀏覽器會做這樣一步操作:
把代碼之前所有對a的操作映射到全局
于時之前對塊級作用域內變量a賦值為1的操作也會映射到全局的變量a,所以全局的a變成了1。所以最后控制臺打印的是結果是21,和1,因為全局的a映射了。