let與var 塊級作用域
阿新 • • 發佈:2020-09-02
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()
答案:undefined
和ReferenceError
在函式內部,我們首先通過var
關鍵字聲明瞭name
變數。這意味著變數被提升了(記憶體空間在建立階段就被設定好了),直到程式執行到定義變數位置之前預設值都是undefined
。因為當我們列印name
變數時還沒有執行到定義變數的位置,因此變數的值保持為undefined
。
通過let
和const
關鍵字宣告的變數也會提升,但是和var
不同,它們不會被初始化。在我們宣告(初始化)之前是不能訪問它們的。這個行為被稱之為暫時性死區。當我們試圖在宣告之前訪問它們時,JavaScript 將會丟擲一個ReferenceError
錯誤。