ES6新特性-let

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 明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

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

如有错误或建议,欢迎大佬指点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlowerHeap

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值