淺談JS中 var let const 變數宣告
用var來宣告變數會出現的問題:
1. 允許重復的變數宣告:導致資料被覆寫
2. 變數提升:怪異的資料訪問、閉包問題
3. 全域變數掛載到全域物件:全域物件成員污染問題
例1:


用var宣告的變數會默認被提升到當前作用域的頂部
例2:


For回圈內的i變數當前所處的環境是全域作用域(函式區域作用域同理,只不過宣告之后不系結在window上),
所以在最后點擊事件觸發的時候列印的i都是當前作用域上的同一個i,也即是最后的11
,這就產生了閉包,如下圖

ES6 中引入let 和 const,以及塊級作用域來解決這個問題
什么是塊級作用域
塊級作用域:代碼執行時遇到花括號,會創建一個塊級作用域,花括號結束,銷毀塊級作用域
let在全域作用域下定義變數不會掛在到頂層物件window上
let宣告的變數,不允許當前作用域范圍內重復宣告,在塊級作用域中用let定義的變數,在作用域外不能訪問
let不會有變數提升,因此,不能在定義let變數之前使用它
例1(對比):


為什么會出現error,因為在let和const中引入了一個暫存該類變數的區域Temporal Dead Zone,簡稱TDZ,就是我們所說的臨時死區,
在TDZ中的變數不能被訪問,不然就會報錯,只有在給該變數賦值的時候才會從死區內接觸,
問題:let和const申明的變數真的不被提升嗎?
let宣告的變數實際上也會有提升,但是,提升后會將其放入到“暫時性死區”,如果訪問的變數位于暫時性死區,則會報錯:“Cannot access 'a' before initialization”,當代碼運行到該變數的宣告陳述句時,會將其從暫時性死區中移除,
例2(對比):


輕松解決閉包問題
但是我們看到,此時for回圈內()中的let i并不在塊級作用域內,講道理應該最后點擊時,列印的應該是這個全域上的i,這個i最后是11,可是從結果上來看卻不是這樣,
在全域上列印這個i


說明這個for回圈()內的i并不是定義在全域作用域上的
原因:
對于for回圈()內let定義的變數,做了特殊的處理,此變數相當于默認宣告在后面塊級作用域內
const
const 和let特性相同,唯一不同的是,const一般指的都是常量,常量的定義是不可改變的變數,所以用const 申明的變數是不可變的,且只能在定義是進行賦值,
值得注意的是const宣告的常量是指存入記憶體的記憶體空間不可變,這也就意味著,如果存的是參考值,改變參考值內的屬性,const所對應的值就會改變

通常在開發中能寫const就用const,不行就用let,這樣出bug率小
每天學習每日進步,不斷累積,大佬們說過,只會api的前端不是一個好的工程師,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/174700.html
標籤:JavaScript
下一篇:基于canvas的流程編輯器
