在ES5中,頂層對象的屬性與全局變量是等價的,所以使用 var 或 function 聲明的全局屬性都是屬于頂層對象的屬性,而在JS中頂層元素就是 window,所以可以通過 window 來獲取聲明的全局屬性:

頂層對象屬性
首先我們要知道 const 和 let 都是在ES6才出的關(guān)鍵字,在ES6之前是沒有的,而且在ES6中,新增了一個塊級作用域的概念,還有一點(diǎn)就是,使用 var 關(guān)鍵字定義的變量會提升到window;我們先舉幾個例子來說明一下什么是塊級作用域:
var a = "外層變量"
function test1() {
console.log(a) // 外層變量
}
// var會變量提升,提升到函數(shù)的最上面,就相當(dāng)于現(xiàn)在函數(shù)中聲明了a
// 然后在if中初始化了a,需要注意的是,變量提升只提升聲明,不提升初始化
function test2() {
console.log(a) // undefine
if (false) {
var a = "內(nèi)層變量"
}
console.log(a) // 輸出 undefine(若上面的if條件是true的話則輸出 內(nèi)層變量)
}
// let不會變量提升,所以函數(shù)內(nèi)的a只在if中有效果
function test3() {
console.log(a) // 外層變量
if (false) {
let a = "內(nèi)層變量"
}
console.log(a) // 外層變量
}
兩個大括號之間的就稱之為一個塊,塊級作用域也就指的是在當(dāng)前大括號內(nèi)聲明的變量只在當(dāng)前大括號中有用,出了大括號就訪問不到了,我們來看一下使用 const/let 聲明的變量能不能用頂層對象訪問到:

非頂層對象屬性
我們可以看到,使用 const/let 聲明的全局變量,不屬于頂層對象的屬性,訪問不到,那么他們存在于哪里呢?怎么能獲取到呢?

const/let聲明的變量
我們可以看到,使用console.dir打印了Function中所有的屬性與方法,我們用 const/let 聲明的對象存在于這里面,這個Function是個什么東西呢?前面我們說到塊級作用域,函數(shù)內(nèi)部都是屬于塊級作用域,所以最后的結(jié)論就是 用 const/let 聲明的全局變量存在于塊級作用域中。同時也能看出,從ES6開始,全局變量將慢慢的與頂層對象的屬性脫離關(guān)系。