理解ES6中暂时性死区TDZ

什么是暂时性死区

ES6中,在代码块内,使用let/const命令声明变量之前,该变量都是不可用的,在变量声明之前属于该变量的“死区”。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。ES标准并没有明确提出TDZ,但我们常用其描述let、const的不提升效果。

let、const和var的区别

  • let、const是块级作用域,var是全局作用域
  • let、const不存在变量提升,在声明前使用会报错:Uncaught ReferenceError,var会进行变量提升,在var声明之前就访问对应的变量,则会得到undefined。
let x=y;
let y=2;//Uncaught ReferenceError: y is not defined

console.log(a);//undefined
var a=2;

关于 typeof

我们都知道 typeof 用来检测变量的类型,也可判断是否被定义。返回 undefined 表示未定义;但是在 const/let 定义的变量在变量声明之前如果使用了 typeof 就会报错。

typeof a;//Uncaught ReferenceError: a is not defined
let a;

typeof b;//undefined

如果一个变量根本没有被声明,使用 typeof 反而不会报错。由此可见 not defined 和 undefined 是有区别的。在使用let/const进行声明的变量在使用 typeof 时不一定安全。

默认参数的临时死区

与 let 声明类似,定义参数时会为每个参数创建一个新的标识符绑定,该绑定在初始化之前不可被引用,如果试图访问会报错。当调用函数时,会通过传入的值或参数的默认值初始化该参数。

function add(x, y = x) {
    return x + y;
}
console.log(add(2));//4

在这个例子中,调用函数add(2)时相当于js引擎做了如下操作:

let x=2;
let y=x;

由于传参时已经对x进行了初始化,所以y可以访问x的值。但反过来就会报错。

let y=2;
function add(x=y, y) {
    return x + y;
}
console.log(add(undefined,1));//Uncaught ReferenceError: y is not defined

在这个例子中,调用 add(undefined,1) 时相当于JS引擎在背后做了如下事情

//add(undefined,1)
let x=y;
let y=1;

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域。虽然在函数外部定义了变量y,但参数形成的是一个单独的作用域,初始化结束时才会这个作用域才会消失。所以在x初始化时,y并未被初始化,此时y尚处于临时性死区中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值