這篇博文是我在心情不好的情況下寫的。
一、作用域
作用域,就是變量起作用的區域(範圍)。或者說,js代碼執行時,查找變量的範圍。
- ES5及其以前:
JS的變量作用域分爲:全局作用域和函數作用域(局部作用域)
在google的控制檯裏,可以看到
- 、用var 聲明的變量a1是全局變量,是window對象的屬性
- 、用var聲明的變量a2和a3,都是local的作用域
- ES6開始有了let關鍵字後:
變量有了塊級作用域,所謂塊級作用域中的“塊”,表示用 一對花括號括起來的一塊代碼。
不管是全局作用域,還是函數作用域,其實都是塊級作用域,無非是大塊還是小塊的問題。
在google的控制檯裏,我們可以看到,有四個作用域(scope),分別是global(全局)、script(腳本)、local(局部)、block(塊級)。
- Global作用域裏的內容全是window對象的屬性。
- Script裏是v1;
- Local(function f1)裏是v2
- Block裏是v3
二、作用域鏈
作用域鏈是指:當js編譯器在尋找變量時,先在最近的作用域(花括號)裏找,如果找不到,則抄上一級作用域(花括號)裏找,依次類推,直到找到或者找不到爲止。這就是作用域鏈。
三、Var定義的全局變量是window的屬性,但是let定義定義的全局變量不是window的屬性?
可以看到:
- 、用var聲明的a0,是window對象的屬性
- 、用let聲明的v1,屬於script的作用域
- 、用let聲明的v2,屬於local的作用域
- 、用let聲明的v3,屬於block作用域
這篇博文是我在心情不好的情況下寫的