let
和 const
是JavaScript新出的兩個變量聲明的方式。前面說過let
和 var
相似,可是它們的做用域是不同的。html
關於做用域,在ES6以前的Javascript中,函數體是惟一能可以建立新做用域的地方。那時候沒有let
,用var
聲明的變量,做用域要麼是全局,要麼是函數體,沒有塊級的做用域(塊做用域變量在包含它們的塊外部或for循環外部是不能被訪問的)。而新版的Javascript引入了let
關鍵字,用以聲明一個塊級域的本地變量,這樣能避免一些問題。git
至於const
,它的做用域和let
同樣,可是是聲明建立一個只讀常量,這裏要注意一下,這並不意味着該常量指向的值不可變,而是該常量只能被賦值一次!github
舉個例子:typescript
// numLivesForCat的值不能再變了 const numLivesForCat = 9; const kitty = { name: "Aurora", numLives: numLivesForCat, } // 錯誤,kitty指向的對象不能變 kitty = { name: "Danielle", numLives: numLivesForCat }; // 沒問題,對象的屬性能夠變化 kitty.name = "Rory"; kitty.name = "Kitty"; kitty.name = "Cat"; kitty.numLives--;
另外,使用const
定義常量時,必定要初始化。函數
Typescript做爲Javascript的超集,天然也是支持let
和const
的。翻譯
const
沒什麼好說的,你須要常量就用它,不須要就不用。可是let
和var
要比較一下。code
使用var
聲明變量時,無論你聲明多少次,你獲得的只有一個變量,而使用let
時,同一個變量名在同一做用域內聲明一次以上會報錯。htm
使用var
時很容易出bug,好比:對象
function sumMatrix(matrix: number[][]) { var sum = 0; for (var i = 0; i < matrix.length; i++) { var currentRow = matrix[i]; for (var i = 0; i < currentRow.length; i++) { sum += currentRow[i]; } } return sum; }
裏層for循環中的i會覆蓋外層的i,由於i引用的都是相同的函數做用域內的變量。ip
可是若是把var
換成let
,內層的for循環本身是一個塊級做用域,會屏蔽外部的做用域中的相同名字的變量,因此這兩個i會井水不犯河水。
另外,由於var
是函數做用域,因此對於一個var
聲明的變量,你能夠先使用再聲明:
bla = 2; var bla; // ... // 能夠理解爲下面這樣: var bla; bla = 2;
引用一段mozilla文檔中的話:
因爲變量聲明(以及其餘聲明)老是在任意代碼執行以前處理的,因此在代碼中的任意位置聲明變量老是等效於在代碼開頭聲明。這意味着變量能夠在聲明以前使用,這個行爲叫作「hoisting」。
嗯,使用var
時,這叫變量聲明提高,可是若是你使用let
時也這樣作,這叫錯誤! 塊級做用域的變量的一個特色是,它們不能在被聲明以前使用。
最後,建議儘可能用let
替換var
。
本文參考: