ES6新特性-let
ES6中新增了let方法,用于声明变量。let方法与var的方法的不同在于引入了作用域。
一、复习var特性
1、基本用法
在ES6之前我们常用var来声明变量:
var a=1;
这个可以拆分为两步:
var a;
//声明a变量
a=1;
//将a变量初始化为1
2、var提升
刚刚那个例子,我们习惯将var a=1看做一个表达式,但是JavaScript引擎并不这样认为,它会将它当做两个单独的任务,第一个是编译阶段的任务,第二个是执行阶段的任务。
var a;
//编译阶段的任务
a=1;
//执行阶段的任务
编译原理:
JavaScript引擎会在解释JavaScript代码之前首先对其进行编译,编译阶段的一部分工作就是找到所有的声明,并用合适的作用域将其关联起来。
所以变量和函数在内的任何声明都会在代码执行前首先被处理。
console.log(a)
//未声明就输出,则报错
var a
console.log(a)
//声明未初始化,则输出undefined
提升
console.log(a)
var a=1;
//虽然声明在下面,但是不会报错输出undefined
console.log(b)
var b=function(){
console.log("lalala");
}
//同样输出undefined
这里验证了任何声明都会在代码执行前首先被处理。
注意!
只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。
//例如
var a=1
//这里var a会提升,而a=1则不会提升
//同理
var b=function(){
console.log("lalala");
}
//这里var b会提升,后面的函数部分则不会提升。
3、作用域
var声明的变量会加到全局作用域中。
4、顶层对象
var声明的变量属于顶层对象的属性。
var a=1
window.a//1
二、let新特性
1、基本用法
和var相同,都是用来声明变量。
let x=1;
let y
2、不能重复声明
在相同作用域中,不能用let声明同一变量。
let a;
var a;
//报错,因为在相同作用域中,a被重复声明。
{
let a=2;
}
{
let a=2;
}
//不报错,因为在不同作用域
let a=2
{
let a=3
}
//不报错,因为在不同作用域
3、没有声明提升
如果需要使用一个变量,就要去声明再使用。
let a=1;
console.log(a)
//1
console.log(a)
var a=1;
//undefined
console.log(a)
let a=1
//报错
4、作用域
let为JavaScript新增了块级作用域(类似c类语言的作用域)。
5、暂时性死区
ES6 明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
var a=1;
if(true){
console.log(a);
let a=2;
}
//报错
在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
6、顶层对象
let,const,class声明的全局对象,不再属于顶层对象(windows)的属性。
也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
let a=1
window.a//undefined
如有错误或建议,欢迎大佬指点!