概述
什么是暂时性死区
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尚处于临时性死区中。
最后
以上就是狂野马里奥为你收集整理的理解ES6中暂时性死区TDZ的全部内容,希望文章能够帮你解决理解ES6中暂时性死区TDZ所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复