如果您已经用过
let
和const
了,没错,你已经在使用ES6
了。
let
和const
是ES6
新增加的关键字,用于变量的声明。
我们知道,以前的js
声明变量用的是var
,那这个let
和const
跟它有什么区别呢,接下来我们就来探讨一下。
let
声明的变量只在let
命令所在的作用域内有效
{
let a = 1
var b = 2
console.log(a) // 不报错,输出1
console.log(b) // 不报错,输出2
}
console.log(a) // 报错,变量a未定义
console.log(b) // 不报错,输出2
从上面的例子可以看出,let
声明的变量a
,只在声明它的{}
中有效
let
声明的变量不存在变量提升
console.log(a) // 不报错,输出undefined
var a = 1
console.log(b) // 报错
let b = 2
var
的变量在声明之前访问不会报错,访问到的内容是undefined
,而let
声明的变量则不行,那有的朋友会问了,那这个let
不如var
高级,事实并非如此,var
的这种特性降低了可读性和可维护性,为了纠正这种现象,let
命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
let
声明的变量存在暂时性死区
只要块级作用域内存在
let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
ES6
明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
上面代码中,在let
命令声明变量tmp
之前,都属于变量tmp
的“死区”。
let
不允许在相同作用域内重复声明变量
let a = 1;
let a = 2;
var b = 3;
var b = 4;
a // 报错
b // 4
function func(arg) {
let arg;
}
func() // 报错
function func(arg) {
{
let arg;
}
}
func() // 不报错
let
的内容差不多介绍完了,那const
呢
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
const
声明的变量不得改变值,这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值。