首先這個系列的文章只是一個筆記性質的,方便以后的翻看和查閱。內容來自于NICHOLAS.C.ZAKAS所寫,劉振濤翻譯的《深入理解ES6》,大家如果喜歡可以購買。
首先我們要搞明白為什么要有“塊級作用域綁定”,那是因為原先我們使用var聲明變量不管是在全局還是函數內部,最后都會被當做在當前作用域頂部聲明的,這就是俗稱的“提升”機制。例如下面的示例代碼:
雖然value的初始化是在condition成立的條件下執行的,但是再其他作用域范圍內也是可以訪問的,js并不會報錯,代碼的輸出如下:
這就是為什么要有“塊級作用域”。
1、使用“let”聲明
代碼示例如下:
如果使用ES6的let聲明變量,就沒法再其它域內訪問變量了。輸如下:
2、使用“const”聲明
const聲明的是常量,聲明的時候一定要初始化具體的值,一旦初始化了,就不能修改它的值。作用域的范圍和let是一樣的。
但有一點就是用const聲明對象的時候,不能修改對象本身,但是可以修改對象屬性的值。示例代碼如下:
編譯器報錯了,person整個對象不能修改
3、循環中使用“let”和“const”
(1)以前循環使用var定義一個i,那么在循環外面也可以訪問i這個變量。如果使用let定義,那么這個變量就不能訪問了,代碼示例如下:
這里外部也可以訪問i
這里就不能訪問i
(2)循環中的函數,直接來看代碼
上面的代碼結果是只會輸出10次數字10,如果沒用let來聲明i,那么我們會用IIFE表達式來解決這個問題,如果用let聲明i,那么結果就是輸出數字0~9。
(3)我們也可以在循環中使用const,但是一旦是用const那么這個變量則不能修改,一旦修改就會報錯,所以一般const只會用于for-in或者for-of。
4、全局塊作用域綁定
一般我們使用var聲明變量,那么這個變量就會綁定到window上面,所以我們很容易覆蓋其他的變量。但是使用let則不會綁定到window上面。