我是靠谱客的博主 狂野马里奥,最近开发中收集的这篇文章主要介绍理解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尚处于临时性死区中。

最后

以上就是狂野马里奥为你收集整理的理解ES6中暂时性死区TDZ的全部内容,希望文章能够帮你解决理解ES6中暂时性死区TDZ所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部