TS 跟最新的 JS 标准一样支持三种变量声明类型:var
,let
,const
。
其中 let
是为了取代 var
的。所以我们在 TS 一般情况只使用 let
和 const
let
声明变量,const
声明常量
为什么不建议使用 var
- 首先是
var
变量的作用域是反人类的。比如如下代码:
function f(init:boolean){
if(init){
var x = 10;
}
return x;
}
按我们的编程经验,变量 x
应该是被限定在 if
这一代码块中。但是 x
变量的作用域却是整个函数的。所以容易导致错误。
- 其次
var
变量的捕获规则也是反人类的。
例如如下代码:
for(var i = 0; i< 10; i++){
setTimeout(function(){console.log(i);},100*i);
}
上面的代码将输出 10 个10, 而不是直觉上的 0到9这10个数。
核心问题还是在于var
声明的变量是整个函数作用域的,所以10次输出输出的其实都是同一个变量。所以输出的是此变量的最终值。另外也说明在 JS 中 var
变量是可以重复声明的。
在之前的 JS 标准中为了解决上面的问题,一般是通过添加一层函数调用的方式来解决,代码如下:
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
而使用 let
声明变量则没有上面的问题。
-
let
变量的作用域,符合一般的逻辑,是基于代码块的。 -
let
对于循环来说,let
为基于每一次循环创建新的作用域。也就避免了上面var
循环中的问题。
const
继承了 let
声明的优点。但是是常用声明常量的。也很好理解。
网友评论