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。
