/*頂層對象,在瀏覽器環(huán)境指的是window對象,在 Node 指的是global 對象 ES5 之中,
頂層對象的屬性與全局變量是等價的*/
/* window.a = 1; a // 1
a = 2; window.a // 2 */
上面代碼中,頂層對象的屬性賦值與全局變量的賦值,是同一事.
頂層對象的屬性與全局變量掛鉤,被認為是 JavaScript 語言最大的設計敗筆之一。
這樣的設計帶來了幾個很大的問題,首先是沒法在編譯時就報出變量未聲明的錯誤,
只有運行時才能知道(因為全局變量可能是頂層對象的屬性創(chuàng)造的,而屬性的創(chuàng)造是動態(tài)的);
其次,程序員很容易不知不覺地就創(chuàng)建了全局變量(比如打字出錯);
最后,頂層對象的屬性是到處可以讀寫的,這非常不利于模塊化編程。
另一方面,window對象有實體含義,指的是瀏覽器的窗口對象,頂層對象是一個有實體含義的對象,也是
不合適的。
ES6 為了改變這一點,一方面規(guī)定,為了保持兼容性,var命令和function命令聲明的全局變量,
依舊是頂層對象的屬性;另一方面規(guī)定,let命令、const命令、class命令聲明的全局變量,
不屬于頂層對象的屬性。也就是說,從 ES6 開始,全局變量將逐步與頂層對象的屬性脫鉤
/*var a = 1; window.a // 1
如果在 Node 的 REPL 環(huán)境,可以寫成 global.a 或者采用通用方法,寫成 this.a;
let b = 1; window.b // undefined*/