作用域鏈
什麼是作用域
- 從script標籤內的聲明的變量和函數都是0級作用域
- 只要函數才能開闢作用域
- 所以聲明在0級作用域的函數開闢的一個作用域是1級作用域
- 在1級作用域再聲明一個函數就會開闢又一個作用域是2級作用域,依次類推
作用域鏈
- 變量的訪問規則就是,自己的作用域裏聲明這個變量就用這個變量,沒有就向上一級的作用域裏找 ,一直找到0級作用域,找不到就會報錯
- 每一個作用域向鏈條一樣連接起來,就叫作用域鏈
預解析機制
- 在執行代碼前爲了,代碼運行的速率提高,在代碼的執行前瀏覽器會預解析代碼會在內存中開闢好變量和函數的空間,執行代碼時就賦值給變量就行了。
- 除了開闢變量和函數的空間,還有一個過程就是變量提升
變量提升
- 就是把所有var聲明的變量和function關鍵字聲明的函數,都會提升到他所在作用域的頂端,然後賦值語句留在原來位置
let和var的比較
- 相同點:
都是用來聲明變量的 - 不同點:
1.var在0級作用域裏聲明的變量是window的屬性,let聲明的變量不是
2.var聲明的變量在預解析的機制過程會有變量提升,但let的不會
3.var的作用域參考的是函數開闢的作用域,而let參考的塊級作用域就是有(大括號{}就一個塊級作用域)
4.var可以在相同的作用域重複聲明相同的變量名的變量,而let聲明的變量名不能相同,會報錯