1. 程式人生 > 實用技巧 >let與var 塊級作用域

let與var 塊級作用域

javaScript中沒有塊級作用域,執行JavaScript程式碼可能會獲取到意想不到的結果。比如:

1 for (var index = 0; index < 5; index++) {
2   console.log(index)
3 }
4 console.log(index, '在外面訪問index')

執行結果:

因為JavaScript沒有塊級作用域,在for迴圈結束後依舊會存在迴圈外部的執行環境中因此能夠打印出來。

ECMAScript 6(簡稱ES6)中新增了塊級作用域。同樣的for迴圈

1 for (let index = 0; index < 5; index++) {
2 console.log(index) 3 } 4 console.log(index, '在外面訪問index')

此時的執行結果:

對於let來說,for語句初始化變數的表示式所定義的變數,只會存在迴圈的環境中,在迴圈外部列印index ,只能報錯。

擴充套件知識:

輸出是什麼?

1 function sayHi() {
2   console.log(name)
3   console.log(age)
4   var name = 'Lydia'
5   let age = 21
6 }
7 
8 sayHi()

答案:undefinedReferenceError

在函式內部,我們首先通過var關鍵字聲明瞭name變數。這意味著變數被提升了(記憶體空間在建立階段就被設定好了),直到程式執行到定義變數位置之前預設值都是undefined。因為當我們列印name變數時還沒有執行到定義變數的位置,因此變數的值保持為undefined

通過letconst關鍵字宣告的變數也會提升,但是和var不同,它們不會被初始化。在我們宣告(初始化)之前是不能訪問它們的。這個行為被稱之為暫時性死區。當我們試圖在宣告之前訪問它們時,JavaScript 將會丟擲一個ReferenceError錯誤。