ES5 只有兩種聲明變量的方法:var
命令和function
命令。
ES6除了添加let
和const
命令,后面章節還會提到,另外兩種聲明變量的方法:import
命令和class
命令。所以,ES6 一共有 6種 聲明變量的方法。
頂層對象,在瀏覽器環境指的是window
對象,在Node指的是global
對象。ES5之中,頂層對象的屬性與全局變量是等價的。
window.a = 1; a // 1 a = 2; window.a // 2
頂層對象的屬性與全局變量掛鈎,被認為是JavaScript語言最大的設計敗筆之一。
ES6為了改變這一點,一方面規定,為了保持兼容性,var
命令和function
命令聲明的全局變量,依舊是 頂層對象 的屬性;另一方面規定,let
命令、const
命令、class
命令聲明的全局變量,不屬於頂層對象 的屬性。也就是說,從ES6開始,全局變量將逐步與頂層對象的屬性脫鈎。
var a = 1; // 如果在Node的REPL環境,可以寫成global.a // 或者采用通用方法,寫成this.a window.a // 1 let b = 1; window.b // undefined
上面代碼中,全局變量a
由var
命令聲明,所以它是頂層對象的屬性;全局變量b
由let
命令聲明,所以它不是頂層對象的屬性,返回undefined
。