在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
聲明的全局變量,不屬于頂層對象的屬性帅刀,訪問不到让腹,那么他們存在于哪里呢?怎么能獲取到呢扣溺?
我們可以看到骇窍,使用console.dir打印了Function中所有的屬性與方法,我們用 const/let
聲明的對象存在于這里面锥余,這個Function是個什么東西呢腹纳?前面我們說到塊級作用域,函數(shù)內(nèi)部都是屬于塊級作用域驱犹,所以最后的結(jié)論就是 用 const/let
聲明的全局變量存在于塊級作用域中嘲恍。同時也能看出,從ES6開始雄驹,全局變量將慢慢的與頂層對象的屬性脫離關(guān)系佃牛。