变量声明
let
和 const
是JavaScript新出的两个变量声明的体式格局。前面说过let
和 var
相似,然则它们的作用域是不一样的。
关于作用域,在ES6之前的Javascript中,函数体是唯一能能够建立新作用域的处所。那时候没有let
,用var
声明的变量,作用域要么是全局,要么是函数体,没有块级的作用域(块作用域变量在包括它们的块外部或for轮回外部是不能被接见的)。而新版的Javascript引入了let
关键字,用以声明一个块级域的当地变量,如许能防止一些问题。
至于const
,它的作用域和let
一样,然则是声明建立一个只读常量,这里要注意一下,这并不意味着该常量指向的值不可变,而是该常量只能被赋值一次!
举个例子:
// 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
要比较一下。
运用var
声明变量时,不论你声明多少次,你获得的只要一个变量,而运用let
时,统一个变量名在统一作用域内声明一次以上会报错。
运用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援用的都是雷同的函数作用域内的变量。
然则假如把var
换成let
,内层的for轮回本身是一个块级作用域,会屏障外部的作用域中的雷同名字的变量,所以这两个i会相得益彰。
别的,因为var
是函数作用域,所以关于一个var
声明的变量,你能够先运用再声明:
bla = 2;
var bla;
// ...
// 能够理解为下面如许:
var bla;
bla = 2;
援用一段mozilla文档中的话:
因为变量声明(以及其他声明)老是在恣意代码实行之前处置惩罚的,所以在代码中的恣意位置声明变量老是等效于在代码开首声明。这意味着变量能够在声明之前运用,这个行动叫做“hoisting”。
嗯,运用var
时,这叫变量声明提拔,然则假如你运用let
时也如许做,这叫毛病! 块级作用域的变量的一个特点是,它们不能在被声明之前运用。
末了,发起只管用let
替代var
。
本文参考: