一、var声明
使用var的好处:公用变量,作用域下都可以获取到值。
使用var的弊端:
-
var
声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问,也就是说,var可以在其赋值前被访问(undefined),即使其定义在代码块内。function f(shouldInitialize: boolean) { if (shouldInitialize) { var x = 10; } return x; } f(true); // returns '10' f(false); // returns 'undefined'
-
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; }
-
如果var定义的变量在for循环外部,并且for循环中为异步的输出,则会先执行同步循环,最后再走异步回调,那这样的话获取到的值就会是变量的最终值。
for (var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 100 * i); }
一个通常的解决方法是使用立即执行的函数表达式(IIFE)来捕获每次迭代时
i
的值:for (var i = 0; i < 10; i++) { // capture the current state of 'i' // by invoking a function with its current value (function(i) { setTimeout(function() { console.log(i); }, 100 * i); })(i); }
二、let声明
- 块作用域变量在包含它们的块或
for
循环之外是不能访问的。 - 不能在被声明之前读或写,直到声明它的代码之前的区域都属于 暂时性死区。
- 不能在1个作用域里多次声明。
- 在一个嵌套作用域里,内层let定义的变量,会屏蔽外层let定义的变量。
三、const声明
- 给变量赋值后不能再改变(基本类型对应的是值,复杂类型对应的是引用)。
- 不能重新赋值。
- 可将对象内部属性设置为只读。
四、解构
解构表达式要尽量保持小而简单。