TypeScript初试(二)

在js中,变量的声明一般用var,但是在上一次分享中大家可能也看到了,当时采用的变量声明的关键字为let。那么这个let是个什么东西呢?
let 是es6新增的一个变量声明关键字,用来声明局部变量。同时let也是ts中推荐的声明变量的关键字。let声明的变量是局部变量,它的作用于是块级作用域。

有一个比较好的例子可以让我们清楚的了解

for (var i = 0; i < 10; i++) {
    setTimeout(function() { console.log(i); }, 100 * i);
}

上面代码的执行结果为:

10
10
10
10
10
10
10
10
10
10

改为let后:

for (let i = 0; i < 10 ; i++) {
    setTimeout(function() {console.log(i); }, 100 * i);
}

执行结果:

0
1
2
3
4
5
6
7
8
9

这个才是我们想要的结果,因此推荐在ts中或者es6中使用let来代替。

start

let 声明

通过上面的小例子可以看出var声明存在的问题,这也说明了用let声明变量的好处。除了名字不一样以外,let声明变量的写法与var是一样的。
let i: number = 0;
我们都知道,在js中,通过var声明的变量会有一个变量声明提前,即js解析引擎读取到var之后,会将var声明的变量提升至开始并赋值undefined,当用到的时候,才会再进行重新赋值。

变量声明不提前

而使用let声明的变量,不会出现变量声明提前,所以如果在let声明之前使用let声明的变量会报错。

a++; //变量a的作用域在let声明之后,所以此处找不到,报错。
let a: number = 0;
let的作用域

如果是在函数中或者其他块级作用域如for、if等,用let声明的话,函数外面也是找不到的。

function f(input: boolean) {
    let a = 100;

    if (input) {
        // if语句块在变量a的作用域中,可以找到。
        let b = a + 1;
        return b;
    }

    // 变量b的作用域为if语句块,所以此处找不到,报错。
    return b;
}

在上面的例子中,我们通过let分别声明了两个变量a、b。
a的作用域是f函数体内,所以,在if语句中可以找到。
b的作用域是if语句块内,所以外部找不到就会报错。

关于重复声明的问题

之前的js中,无论用var重复声明一个变量多少次,都不会报错,但是还是只有一个。如果重复声明并给同一个变量赋值的话,也不会报错,只是变量的值是最后一次赋值的值。
但是当我们通过let进行声明变量时,在同一个作用域内声明两个相同的变量就会报错。

var a: string = 'hi';
var a: string = 'hehe'; //不会报错,但是a的值为最后一次赋值的值,即为hehe;


let b: number = 0;
let b; //报错,相同作用域内不能使用let重复声明同一个变量。

const 声明

const是声明常量,这个大家在js中应该也有用过。const的作用域与let相同,但是const声明的变量的值不会发生改变。
const还有一个好处就是,采用const声明的变量如果赋值的是一个表达式或者计算,在声明之初,这个值就已经计算出来了。不会像var一样,每次用到这个变量都会在计算一遍。在项目中遇到了很多绘制环形图或者折线图这种的需求,有很多变量是通过传入的数据或者图形来计算大小的,这个时候使用const,在声明之初就将这个变量的值计算了出来,后续的调用会提高效率。

function drawLine(length: number): void {
    //声明完就会将num的值计算出来。
    const num: number = length * 10 + 1;

    //num已经计算好了,直接调用,不会像var声明的变量一样每次调用都会重新计算。
    console.log(num);
}

const变量的内部状态是可以改变的,如:

const zhangshuang = {
    name: zhangshuang,
    age: 26
}

zhangshuang.name = ZhangShuang; //不会报错,内部状态修改了。

end

let VS const

那么我们什么时候用let,什么时候使用const呢?一般来说,变量的声明最好遵循最小特权原则。也就是说,如果这个变量声明之后不会更改,那么我们就用const来声明;如果以后可能会改变,那我们就使用let来声明。

发表评论

邮箱地址不会被公开。 必填项已用*标注