/*頂層對(duì)象,在瀏覽器環(huán)境指的是window對(duì)象鲤拿,在 Node 指的是global 對(duì)象 ES5 之中署咽,
頂層對(duì)象的屬性與全局變量是等價(jià)的*/
/* window.a = 1; a // 1
a = 2; window.a // 2
*/
上面代碼中,頂層對(duì)象的屬性賦值與全局變量的賦值宁否,是同一事.
頂層對(duì)象的屬性與全局變量掛鉤,被認(rèn)為是 JavaScript 語(yǔ)言最大的設(shè)計(jì)敗筆之一慕匠。
這樣的設(shè)計(jì)帶來(lái)了幾個(gè)很大的問(wèn)題,首先是沒(méi)法在編譯時(shí)就報(bào)出變量未聲明的錯(cuò)誤蓉媳,
只有運(yùn)行時(shí)才能知道(因?yàn)槿肿兞靠赡苁琼攲訉?duì)象的屬性創(chuàng)造的歹苦,而屬性的創(chuàng)造是動(dòng)態(tài)的)督怜;
其次狠角,程序員很容易不知不覺(jué)地就創(chuàng)建了全局變量(比如打字出錯(cuò));
最后丰歌,頂層對(duì)象的屬性是到處可以讀寫(xiě)的,這非常不利于模塊化編程眼溶。
另一方面,window對(duì)象有實(shí)體含義堂飞,指的是瀏覽器的窗口對(duì)象绑咱,頂層對(duì)象是一個(gè)有實(shí)體含義的對(duì)象绰筛,也是
不合適的描融。
ES6 為了改變這一點(diǎn),一方面規(guī)定窿克,為了保持兼容性,var命令和function命令聲明的全局變量具被,
依舊是頂層對(duì)象的屬性只损;另一方面規(guī)定硬猫,let命令改执、const命令、class命令聲明的全局變量辈挂,
不屬于頂層對(duì)象的屬性。也就是說(shuō)终蒂,從 ES6 開(kāi)始遥诉,全局變量將逐步與頂層對(duì)象的屬性脫鉤
/*var a = 1; window.a // 1
如果在 Node 的 REPL 環(huán)境噪叙,可以寫(xiě)成 global.a 或者采用通用方法,寫(xiě)成 this.a;
let b = 1; window.b // undefined
*/