頂層對(duì)象的屬性
頂層對(duì)象 在瀏覽器環(huán)境中,指的是,window 對(duì)象, 在 node 環(huán)境中 指的是 global 對(duì)象。
es5 中,頂層對(duì)象 的 屬性,與, 全局變量 是 等價(jià)的。
window.a = 1;
a // 1
a = 2;
window.a // 2
上面 代碼中,頂層對(duì)象 的 屬性 賦值,與,全局變量的賦值是 同一件事。
頂層對(duì)象的屬性 與 全局變量 相關(guān), 被認(rèn)為是 JavaScript 語(yǔ)言中 最大的設(shè)計(jì)敗筆之一。
這樣 的 設(shè)計(jì)帶來(lái)了幾個(gè)很大的問(wèn)題:
首先, 無(wú)法 在編譯時(shí),就 提示 該變量 未聲明的錯(cuò)誤,只有運(yùn)行時(shí)才能知道(因?yàn)槿孔兞靠赡苁?頂層對(duì)象的屬性創(chuàng)造的,而屬性的創(chuàng)造是動(dòng)態(tài)的);
其次,程序員 很容易 不知不覺(jué) 的 就 創(chuàng)建 全局變量(比如 打字出錯(cuò))。
最后,頂層對(duì)象的屬性,到處都 可以 讀寫(xiě)的,這 非常 不利于模塊化 編程。
ES6 為了 改變這一點(diǎn), 一方面 規(guī)定,為了保持 兼容性, var 命令 和 function 命令 聲明的全局變量,
依舊 是 頂層對(duì)象的屬性; 另一方面,規(guī)定,let 命令, const 命令 , class 命令 聲明的 全局變量,
將 不屬于 頂層對(duì)象的屬性。 從 ES6 開(kāi)始,全局變量,將逐步 與 頂層 對(duì)象的 屬性,隔離。
var a = 1;
// 如果 在 Node 的 REPL 環(huán)境,可以寫(xiě)成 global.a;
// 或者 采用 通用的方法,寫(xiě)成 this.s
window.a // 1
let b = 1;
window.b // undefined
上面的代碼中,全局變量 a 由 var 命令 聲明,所以 它是 頂層 對(duì)象的 屬性,全局變量 b 由 let 命令聲明, 所以 它 不是 頂層對(duì)象 的 屬性,返回 undefined。