什么是暂时性死区

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 definedconsole.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相关推荐

  1. 理解ES6中的TDZ(暂时性死区)

    什么是TDZ Temporal Dead Zone(TDZ)是ES6(ES2015)中对作用域新的专用语义.TDZ名词并没有明确地写在ES6的标准文件中,一开始是出现在ES Discussion讨论区 ...

  2. 【前端17_JS】ES 6:Let 、Const、对象冻结、解构赋值、暂时性死区 TDZ、惰性求值、模板字符串

    ES 6 简介 let 声明变量 变量不提升 暂时性死区 TDZ const 静态变量 (常量*) 实质 引申 对象冻结 解构赋值 起步 ...arr 展开运算符 ...[] 数组拓展运算符 传参 找 ...

  3. 理解es6中的暂时性死区

    引入 什么是作用域? 一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域. 全局作用域 JS中没有明确的全局作用域的概念,只有局部作用域以及全局执行环 ...

  4. 理解ES6中的暂时死区(TDZ)

    Temporal Dead Zone(TDZ)是ES6(ES2015)中对作用域新的专用语义.TDZ名词并没有明确地写在ES6的标准文件中,一开始是出现在ES Discussion讨论区中,是对于某些 ...

  5. ES2015中let的暂时性死区(TDZ)

    Tomporal Dead Zone (TDZ)是ES2015中对作用域新的专用定义.是对于某些遇到在区块作用域绑定早于声明语句时的情况.Tomporal Dead Zone (TDZ)可以理解为时间 ...

  6. 暂时性死区(TDZ)

    常见js面试题之一: 提示:又是一道常见的前端面试题,什么是暂时性死区? 问题描述: console.log(a);var a = 1; 日志输出:undefined console.log(a);l ...

  7. 什么是暂时性死区(TDZ)?

    常见js面试题之一: 提示:又是一道常见的前端面试题,什么是暂时性死区? 问题描述: console.log(a);var a = 1; 日志输出:undefined console.log(a);l ...

  8. 这篇看完我得理解ES6中中常见语法

    目录 前言 1let篇 1.1作用域 1.2变量提升 1.3相同作用域赋值 2const篇 3模板字符串篇 3.1传统 3.2模板字符串复制 4扩展运算符篇 4.1传统赋值 4.2扩展字符串复制 前言 ...

  9. 撤底理解es6中的箭头函数

    本质上 是一个函数,是function 是一个被编译层加工过的函数 用 babel 编译一下箭头函数看看,如下 //es6 const a = ()=>{ console.log(this) } ...

最新文章

  1. aws lambda_为什么我会自动删除所有旧的推文以及我用来执行此操作的AWS Lambda函数...
  2. 万字干货 | Python后台开发的高并发场景优化解决方案
  3. R语言数据类型:Logical、Numeric、Integer、Complex、Character、Vectors、Lists、Matrices、Arrays、Factors、DataFrames
  4. 药品查询APP开发流程(七)--开发—yao.js
  5. 微信小程序开发3——事件处理
  6. python assert函数
  7. python把字符串转成字典
  8. DBUtils 学习使用
  9. GNU Call 开源的Skype替代项目
  10. JS获取浏览器高度、屏幕高度、宽屏
  11. 如何在CHROME里调试前端代码?
  12. 使用 GitHub Pages 和 Hexo 以及 Aurora 主题搭建静态个人博客
  13. 用GoldWave剪辑编辑视频中的音频文件
  14. MySQL从入门到精通之sql语言---(9月2日更新)
  15. 2021-07-30-DJ-005 Django模型的数据批量加载
  16. HNUST OJ 1997 琪露诺的完美算术教室
  17. 电脑增加机械硬盘计算机管理,电脑加装机械硬盘直接插上就行了么
  18. VS2017学习C++基础十一(项目实战:小公主养成记)
  19. 8cm等于多少像素_1cm等于多少像素??
  20. 安卓直接展示html,Android textView展示html图片,实现图文混排,点击查看大图片

热门文章

  1. android 系统更新版本比较好,手机系统到底要不要更新 这里面有什么猫腻?
  2. python编程-----利用爬虫获取自如房间信息(三)
  3. HDU 5835 Danganronpa
  4. rimraf : 无法加载文件 C:\Users\Admin\AppData\Roaming\npm\rimraf.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅
  5. Python-OpenCV 图像加权混合(滤色, 叠加, 柔光, 强光)
  6. 平台软件每日构建总结
  7. srgb色彩空间_网页设计师的色彩:了解sRGB
  8. 大型高并发高负载网站的系统架构
  9. 深入解析网页防篡改技术
  10. 最速降线求解的数学模型