Typescript Handbook 精简版之变量声明

变量声明

letconst 是JavaScript新出的两个变量声明的方式。前面说过letvar相似,可是它们的做用域是不同的。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的超集,天然也是支持letconst的。翻译

该用哪一个

const没什么好说的,你须要常量就用它,不须要就不用。可是letvar要比较一下。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

本文参考:

相关文章
相关标签/搜索