Typescript Handbook 精简版之变量声明

变量声明

letconst 是JavaScript新出的两个变量声明的体式格局。前面说过letvar相似,然则它们的作用域是不一样的。

关于作用域,在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的超集,天然也是支撑letconst的。

该用哪一个

const没什么好说的,你须要常量就用它,不须要就不必。然则letvar要比较一下。

运用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

本文参考:

    原文作者:er3456qi
    原文地址: https://segmentfault.com/a/1190000004410597
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞