浅谈ES6后的TDZ时间死区

本文探讨了ES6中let和const引入的块级作用域以及与var的区别。在var的情况下,变量会提升并默认赋值为undefined。而let和const不会变量提升,但在声明之前使用它们会导致TDZ(Time Dead Zone)错误,即在声明之前的区域尝试访问这些变量会抛出错误。const变量不可重新赋值。
摘要由CSDN通过智能技术生成

1、const、let和var

在es6新特特性这,let和const可以达到局部作用域的效果。

1.1 var

var a = 4
function say () {
  console.log(a)
  var a
}
say()

大家在网上听的最多的就是var会进行变量提升,事实也是如此。上面例子中,函数外部声明变量a赋值为4。当调用函数时,内部的变量a会提到log前提前声明,并且默认赋值为undefined。然后才log。如下图

var a = 4
function say () {
  var a = undefined
  console.log(a)
}
say()

所以你们看到的结果为undifind,同理下面例子也是如此

console.log(b)
var b = 4
console.log(b)

上面例子会先变量声明赋值为undefined,然后在将4赋值给变量b

var b = undefined
console.log(b)
b = 4
console.log(b)

1.2 let/const

在let中,很多人在面试中都会回答到。他与var最大的区别是不会变量提升,其实不然。可以看下面这个例子

let a = 1
function say () {
  console.log(a)
  let a = 2
}
say()

按照大多数人的了解,这个结果不会变量提升,所以应该输入外部的1才对。但是结果却是报错,下面看看分析。

let a = 1
function say () {
  let a
  console.log(a)
  a = 2
}

在调用say函数的时候,他发现在局部作用域(函数内部)里有一个变量声明,它依旧会将其变量提升,只是这次与var的区别不太一样,var在提升的同时,他会进行一个赋值为undefined,但是let只是单纯的变量提升。所以你会发现这个是报错的。

const 也是一样的道理,只是在const中不能对变量进行更改。

2、TDZ时间死区

其实刚刚我们已经接触到了时间死区,只是你没有发现。

let a = 520
function say () {
  // 时间死区开始
  console.log(a)
  // 时间死区结束
  let a = 520
}

在上面例子中,因为我们下方使用let对a进行变量声明后,造成的变量提升,导致我们无法对a进行修改。这个位置就是我们说的时间死区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值