變量提高的原理

當程序執行這一段代碼時code

console.log(a);
var a = 2;

有經驗的同窗都知道控制檯會輸出undefined而不是報錯a is not defined
這是由於此時發生了變量提高,代碼能夠理解爲如下形式ip

var a;
console.log(a);// undefined
a = 2;

這是爲何呢,讓我先說明如下幾點作用域

  • 一段JavaScript代碼,是先由編譯器編譯成可執行代碼,再交給引擎去執行的。
  • var關鍵字聲明的變量是在編譯階段聲明的。

每當編譯器遇到var xxx,都會去查找當前做用域是否已存在變量xxx,若是xxx已存在,則忽略該聲明,反之,在當前做用域聲明變量xxx
因此當成程序執行下面代碼時編譯器

console.log(a);
var a = 2;
  1. 首先編譯器查找當前做用域是否存在變量a,發現a並不存在,聲明變量a
  2. 再由引擎執行由編譯器生成的代碼console.log(a),此時變量a已經被編譯器聲明,可是還未被賦值,因此此時控制檯輸出的值是undefined
  3. a = 2,此時變量a的值爲2。

其實關鍵點就在於,由var關鍵字聲明的變量是在編譯階段聲明的,因此會出現變量提高的狀況。
可是編譯器對ES6語法中的constlet關鍵字聲明的變量則不會提早聲明,因此不會出現變量提高。console

相關文章
相關標籤/搜索