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
。
本文参考: