當程序執行這一段代碼時code
console.log(a); var a = 2;
有經驗的同窗都知道控制檯會輸出undefined
而不是報錯a is not defined
這是由於此時發生了變量提高,代碼能夠理解爲如下形式ip
var a; console.log(a);// undefined a = 2;
這是爲何呢,讓我先說明如下幾點作用域
var
關鍵字聲明的變量是在編譯階段聲明的。每當編譯器遇到var xxx
,都會去查找當前做用域是否已存在變量xxx
,若是xxx
已存在,則忽略該聲明,反之,在當前做用域聲明變量xxx
。
因此當成程序執行下面代碼時編譯器
console.log(a); var a = 2;
a
,發現a
並不存在,聲明變量a
。console.log(a)
,此時變量a
已經被編譯器聲明,可是還未被賦值,因此此時控制檯輸出的值是undefined
。a = 2
,此時變量a的值爲2。其實關鍵點就在於,由var
關鍵字聲明的變量是在編譯階段
聲明的,因此會出現變量提高的狀況。
可是編譯器對ES6語法中的const
和let
關鍵字聲明的變量則不會提早聲明,因此不會出現變量提高。console