
<script>
//const、let定義在最上端的代碼全局都可以訪問,所以是全局作用域還是塊級作用域?
const a = 1
let b = 2
console.log(window.a); //undefined
console.log(window.b); //undefined
//顯然全局window對象並不包括a,b
//有意思的一點,const let定義在全局的變量也是屬於塊級作用域,
//可以想象全局作用域里有一個包裹着全局的塊級作用域:類似這種感覺({a,b.....})
//(所有的變量都在其中,只不過只有let,const定義的全局變量具有塊級作用域,window不能訪問;
//而非let,const定義的全局變量,即使也在這個隱形的塊級作用域內,由於這些變量沒有塊級作用域,屬於全局作用域)
</script>

總結:在全局定義變量時(包括定義函數),var所定義的變量(以及function定義的函數)具有全局作用域,所以定義完畢以后就會添加入全局對象(在瀏覽器中即window全局對象)。window全局對象中的變量,可以通過window.xxx來訪問到。由於const let定義的變量是塊級作用域,因此即使是const let全局定義的變量也不能通過window.xxx訪問到(報錯)。我們可以聯想有一個包裹着全局代碼的大括號(塊級作用域);這樣一來,全局定義的const,let在這個最外層的塊級作用域中;顯然window不能訪問;但是沒有塊級作用域的全局變量即使在這個大括號內也屬於全局作用域,window自然可以理所當然的訪問到。