使用VS Code开发TypeScript--定义变量推荐使用let

目录

作用域规则

一直以来我们都是通过var关键字定义JavaScript变量。

var a = 10;

大家都能理解,这里定义了一个名为a值为10的变量。

我们也可以在函数内部定义变量:

function f() {
var message = "Hello, world!"; return message;
}

并且我们也可以在其它函数内部访问相同的变量。

function f() {
var a = 10;
return function g() {
var b = a + 1;
return b;
}
} var g = f();
g(); // returns 11;

上面的例子里,g可以获取到f函数里定义的a变量。 每当g被调用时,它都可以访问到f里的a变量。 即使当g在f已经执行完后才被调用,它仍然可以访问及修改a。

对于熟悉其它语言的人来说,var声明有些奇怪的作用域规则。 看下面的例子:

function f(shouldInitialize: boolean) {
if (shouldInitialize) {
var x = 10;
} return x;
} f(true); // returns '10'
f(false); // returns 'undefined'

有些读者可能要多看几遍这个例子。 变量x是定义在if语句里面,但是我们却可以在语句的外面访问它。 这是因为var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问,包含它的代码块对此没有什么影响。 有些人称此为var作用域或函数作用域。 函数参数也使用函数作用域。

这些作用域规则可能会引发一些错误。 其中之一就是,多次声明同一个变量并不会报错:

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都引用相同的函数作用域内的变量。 有经验的开发者们很清楚,这些问题可能在代码审查时漏掉,引发无穷的麻烦。

JavaScript的严格模式

除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。

"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。

另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员。

进入"严格模式"的标志,是下面这行语句:

  "use strict";

老版本的浏览器会把它当作一行普通字符串,加以忽略。

在TypeScript中,let、const语句需要严格模式,因此,在TypeScript(ts)文件的第一行应该是:

"use strict";

或者把文件tsconfig.json的"target"改为:

"target": "es5"

这样才能保证使用let语句正确。否者,出现:"Block-scoped declarations (let, const, function, class) not yet supported outside strict mode" 错误。

let与var的区别

在TypeScript中,定义变量要用关键字var或者let。let是一种新的var,let和var的区别就是let使js实现了它的块级作用域,即词法作用域或块作用域(注:let可以看成var,它定义的变量被限制在特定范围中才能使用,离开这个范围就自动销毁)。

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

这才是我们希望的结果,因此我们推荐在TypeScript中定义变量尽量使用let。

参考资料

最新文章

  1. 通过FTP将一个数据文件从A服务器下载到B服务器的整个过程
  2. MVVM设计模式《网摘》
  3. java 使用相对路径读取文件
  4. Meta键盘
  5. WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
  6. hdu3410-Passing the Message(RMQ,感觉我写的有点多此一举。。。其实可以用单调栈)
  7. 3.IP协议,ARP协议,RARP协议
  8. PHPStudy+PHPStorm下配置隐藏项目入口文件
  9. React源码解析:ReactElement
  10. 21_python集合总结
  11. Django之views系统
  12. How To determine DDIC Check Table, Domain and Get Table Field Text Data For Value?
  13. OO,OO以后,及其极限
  14. B. Vova and Trophies 字符串预处理+思维+贪心
  15. Pocket Gem OA: Log Parser
  16. 【原创】Linux基础之Shell脚本常用命令
  17. PE病毒初探——向exe注入代码
  18. 关于 global nonlocal 用法
  19. (2.10)Mysql之SQL基础——约束及主键重复处理
  20. bootstrap的引入和使用

热门文章

  1. java第一天的疑问
  2. linux 目录说明
  3. addChildViewController 用法
  4. 查看文件系统类型的Linux命令
  5. 三元运算和lambda表达式
  6. yield 生成器例子
  7. ie浏览器下HTML上传控件input=file的美化
  8. 为什么我要使用一个20年前的IBM老键盘
  9. 转: fscanf()函数详解
  10. 转:AM335X 启动流程