常见js面试题之一:

提示:又是一道常见的前端面试题,什么是暂时性死区?

问题描述:

       console.log(a);var a = 1;

日志输出:undefined

        console.log(a);let a = 1;

下面我们可以看到这里的日志输出出现了报错,

‘Uncaught ReferenceError: Cannot access ‘a’ before initialization’
未捕获的引用错误:在初始化之前无法访问“a”

原因分析:

为什么会出现这种情况呢?这就是我们今天要了解的js中的暂时性死区( temporal dead zone,简称TDZ )
接下来我们看一下关于ES6标准中关于暂时性死区的解释:

The variables are created when their containing Lexical Environment is
instantiated but may not be accessed inany way until the variable’s
LexicalBinding is evaluated.

翻译过来的意思就是:

当程序的控制流程在新的作用域(module function 或 block作用域)进行实例化时,在此作用域中用let/const声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。

造成该错误的主要原因是:ES6新增的let、const关键字声明的变量会产生块级作用域,如果变量在当前作用域中被创建之前被创建出来,由于此时还未完成语法绑定,如果我们访问或使用该变量,就会产生暂时性死区的问题,由此我们可以得知,从变量的创建到语法绑定之间这一段空间,我们就可以理解为‘暂时性死区’

那么还有别的会造成引发暂时性死区的现象吗?

let/const关键字未出现之前,typeof运算符是百分之百安全的,现在也会引发暂时性死区的发生,像import关键字引入公共模块、使用new class创建类的方式,也会引发暂时性死区,究其原因还是变量的声明先与使用

与上述关键字相反、var、function等关键字却不会受到TDZ(暂时性死区)的影响,如果在变量常见之前访问,返回结果为undefined

提示:

提示:TDZ(暂时性死区)是一个很重要的概念,在很多的面试环节都有可能问到该概念,其影响let、const、import、class、typeof等关键字的可用性,不容忽视;因此大家一定要养成良好的变成习惯,变量的使用一定要在声明时候使用,否则就会引发‘暂时性死区’

暂时性死区(TDZ)相关推荐

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

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

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

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

  3. 理解ES6中暂时性死区TDZ

    什么是暂时性死区 ES6中,在代码块内,使用let/const命令声明变量之前,该变量都是不可用的,在变量声明之前属于该变量的"死区".这在语法上,称为"暂时性死区&qu ...

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

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

  5. JS:变量提升与临时性死区TDZ

    一.解析过程 js运行前会有编译解析过程,有些错误会在编译过程中被发现. <body><script>var web = 'yooo';console.log(web);var ...

  6. let/const 的变量提升与暂时性死区

    从一道面试题说起 请说出 let,const,var 的区别 大部分的回答是这样的,甚至很多博客中的答案也是这样的: let/const 提供了块级作用域 let 不能重复定义 var 有变量提升,l ...

  7. 详解JS中的TDZ(暂时性死区)

    TDZ(temporal dead zone)暂时性死区 来源: ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域.凡是在声明之前就使用 ...

  8. js 详解es6 let TDZ(暂时性死区)

    暂时性死区产生的原因: ES6 明确规定,如果区块中存在 let 和 const 语句(注意:let.const语句不存在变量提升),这个区块对这些命令声明的变量,从一开始就形成了封闭作用域.凡是在声 ...

  9. 理解JavaScriptES6中的TDZ(暂时性死区)

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

最新文章

  1. Cisco堆叠交换机序号的改变
  2. VS中使用NuGet安装依赖时提示:无法安装程序包“xxx”。你正在尝试将此程序包安装到目标为“.NETFramework,Version=v4.5”的项目中
  3. GDCM:读取和打印DICOM的属性的测试程序
  4. CC254x--API
  5. 工作流实战_23_flowable 任务监听器 事件监听器
  6. 唯美好看的动态个人鹿鸣404单页HTML源码
  7. 华为与万达签订5G战略合作协议 推动5G商业场景应用
  8. router中获取vuex_Vue 中 Axios 的封装和 API 接口的管理
  9. 通过在群晖上安装虚拟机,实现群晖与115网盘的双向同步
  10. qq机器人智能聊天插件源码
  11. 【数据结构】二叉树 —— 遍历二叉树 + 递归的分治(链式存储)
  12. Debian 7 安装metasploit
  13. latex formula
  14. 你们要的炒股软件来啦,同花顺等 6 款工具类软件上架优麒麟软件商店
  15. 侯捷C++视频(百度云盘)
  16. linux crontab : mailed 85 bytes of output but got status 0x004b#012 问题
  17. html基础常用标签,HTML基础(三)常用标签-by Haley(示例代码)
  18. 干货 | 区块链项目估值的逻辑和误区
  19. 使用trashcan恢复linux下误删的文件
  20. FileOutputStream、OutputStreamWriter、BufferedWriter的区别和用法

热门文章

  1. php is_subclass_of,PHP is_subclass_of() 函数用法及示例
  2. java 内存 监控_Java内存监视
  3. 实习每日总结_20161219
  4. 自己建网站时要注意哪些细节
  5. 从钉钉后台对接考勤打卡信息(仅供参考)
  6. 一文讲透智慧农业,一滴水也没有的超级干货
  7. 粒子滤波(particle filtering)梳理
  8. Open3D Intrinsic shape signatures (ISS) 固有形状特征码
  9. 禁用Android底部虚拟按键
  10. 【Android系统】虚拟按键 平板设备中重叠的问题