const let var 3者的区别。
const 和 let 为es6新增的定义变量的关键字。
var存在的问题:
1 作用域问题:
首先以一个for循环代码块来说明:
for (var i = 0; i < 10; ++i) {
console.log(i); //1
}
console.log(i); //2
用var 来定义计算器i的话 在代码标记2处也能成功输出,这说明变量i的作用域超出了for循环代码块,而我们预期的结果应该是变量i应当只作用于for循环内部。
2 重复定义问题:
首先看一下以下代码块:
var num = 16;
var num = 6;
console.log(num); //结果为6
上示代码中num重复定义但是没有报错,num被复写。而为了代码规范和安全在同一作用域内重复定义num应当报错或警告提示。
3 延时使用变量延时过程中变量被改变问题:
for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i)
}, 1000);
}
上述代码中输出结果为3,3,3,期望结果1,2,3。
4 变量提升:
console.log(i);
var i;
var定义的变量会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。我们期望应该是在变量定义前使用该变量应该是禁止的。
es6语法新增let解决上述var存在的问题:
let的特性1:
let 所声明的变量,只在该变量所在的代码块内有效。
这个特性很好的解决了上述的var存在的问题1和问题3.
let的特性2:
let 所声明的变量一定要在声明后使用,否则报错。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
这个特性很好的解决了var的问题4。
let 的特性3:
let 所声明的变量不能在同一作用域做两次声明 会出现报错。
解决var问题2。
es6语法新增关键字const的用法:
const 的特性1:
const声明一个只读的常量。一旦声明,常量的值就不能改变。
这个特性决定了const声明的变量必须在声明的时候赋值。
网友评论