TypeScript学习笔记之变量声明

时间:2022-06-16 15:47:02

var声明
在之前的javascript中,我们用var这个关键字来声明变量。 var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问。并且可以多次声明且不会报错。

/**
* Created by yzq on 2017/1/6.
*/

var a;
var a=1;
var a="123"
function test(isGo) {
if (isGo){
var b=30;
}
return b;
}
console.log(a);//123
console.log(test(true));//30

let 声明
let和const是JavaScript里相对较新的变量声明方式。let与var的主要区别不在语法上,而是语义。
1)块作用域
当用let声明一个变量,它使用的是词法作用域或块作用域。 不同于使用 var声明的变量那样可以在包含它们的函数外访问,块作用域变量在包含它们的块或for循环之外是不能访问的。拥有块级作用域的变量的另一个特点是,它们不能在被声明之前读或写。

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

let b = a + 1;
return b;
}
return b;//错误!在这里是不能被访问的
}

2)重定义及屏蔽
重定义:在同一块作用域下不能重复声明变量。

function test(isGo){
let str;
if(isGo){
let str1="123";
str=function () {
return str1;
}
}
console.log(str());
let str;//错误,不能再同一块作用下再次声明

}
test(true);

屏蔽:在一个嵌套作用域里引入一个新名字的行为称做屏蔽。 它是一把双刃剑,它可能会不小心地引入新问题,同时也可能会解决一些错误。

function a(){
let num:Array<Number>=[1,2,3]
/*用var定义的话,内层的i值回覆盖掉外层的i值,当内层循环完成后外层的i值也就变成了数组的长度*/
for (var i=0;i<num.length;i++){
console.log(`外层i的值为${i}`);

for (var i=0;i<num.length;i++){
console.log(`内层i的值为${i}`);
}
}
}
a();

打印结果为
TypeScript学习笔记之变量声明

下面是用let声明

function a(){
let num:Array<Number>=[1,2,3]
/*用var定义的话,内层的i值回覆盖掉外层的i值,当内层循环完成后外层的i值也就变成了数组的长度*/

/*用let定义的话,内层的i值会屏蔽掉外层的i值,不会影响外层i的值*/
for (let i=0;i<num.length;i++){
console.log(`外层i的值为${i}`);

for (let i=0;i<num.length;i++){
console.log(`内层i的值为${i}`);
}
}
}
a();

TypeScript学习笔记之变量声明

3)块级作用域变量的获取
直观地讲,每次进入一个作用域时,它创建了一个变量的 环境。 就算作用域内代码已经执行完毕,这个环境与其捕获的变量依然存在。

function theCityThatAlwaysSleeps() {
let getCity;

if (true) {
let city = "Seattle";
getCity = function() {
return city;
}
}

return getCity();
}

因为我们已经在city的环境里获取到了city,所以就算if语句执行结束后我们仍然可以访问它。

const声明
const是对let的一个增强,它能阻止对一个变量再次赋值。要注意的是,const声明的变量必须给初始值。
简单来说,const类似于java中的final关键字。如果你的变量需要修改值,那么就用let声明,否则就用const声明。