淺談JS中 var let const 變量聲明

淺談JS中 var let const 變量聲明前端

var來聲明變量會出現的問題:api

 

1. 容許重複的變量聲明:致使數據被覆蓋閉包

2. 變量提高:怪異的數據訪問、閉包問題函數

3. 全局變量掛載到全局對象:全局對象成員污染問題學習

 

1spa

 

 

 

 

var聲明的變量會默認被提高到當前做用域的頂部3d

 

2對象

 

 

 

 

 

 

 

For循環內的i變量當前所處的環境是全局做用域(函數局部做用域同理,只不過聲明以後不綁定在window上)。blog

因此在最後點擊事件觸發的時候打印的i都是當前做用域上的同一個i,也便是最後的11事件

,這就產生了閉包,以下圖

 

 

 

 

 

 

ES6 中引入let const,以及塊級做用域來解決這個問題

 

什麼是塊級做用域

塊級做用域:代碼執行時遇到花括號,會建立一個塊級做用域,花括號結束,銷燬塊級做用域

 

let在全局做用域下定義變量不會掛在到頂層對象window

let聲明的變量,不容許當前做用域範圍內重複聲明,在塊級做用域中用let定義的變量,在做用域外不能訪問

let不會有變量提高,所以,不能在定義let變量以前使用它

 

1(對比):

 

 

 

 

 

 

爲何會出現error,由於在letconst中引入了一個暫存該類變量的區域Temporal Dead Zone,簡稱TDZ。就是咱們所說的臨時死區。

TDZ中的變量不能被訪問,否則就會報錯,只有在給該變量賦值的時候纔會從死區內接觸。

 

問題:letconst申明的變量真的不被提高嗎?

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的前端不是一個好的工程師。

相關文章
相關標籤/搜索