暂时性死区(TDZ)
常见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)相关推荐
- 【前端17_JS】ES 6:Let 、Const、对象冻结、解构赋值、暂时性死区 TDZ、惰性求值、模板字符串
ES 6 简介 let 声明变量 变量不提升 暂时性死区 TDZ const 静态变量 (常量*) 实质 引申 对象冻结 解构赋值 起步 ...arr 展开运算符 ...[] 数组拓展运算符 传参 找 ...
- ES2015中let的暂时性死区(TDZ)
Tomporal Dead Zone (TDZ)是ES2015中对作用域新的专用定义.是对于某些遇到在区块作用域绑定早于声明语句时的情况.Tomporal Dead Zone (TDZ)可以理解为时间 ...
- 理解ES6中暂时性死区TDZ
什么是暂时性死区 ES6中,在代码块内,使用let/const命令声明变量之前,该变量都是不可用的,在变量声明之前属于该变量的"死区".这在语法上,称为"暂时性死区&qu ...
- 什么是暂时性死区(TDZ)?
常见js面试题之一: 提示:又是一道常见的前端面试题,什么是暂时性死区? 问题描述: console.log(a);var a = 1; 日志输出:undefined console.log(a);l ...
- JS:变量提升与临时性死区TDZ
一.解析过程 js运行前会有编译解析过程,有些错误会在编译过程中被发现. <body><script>var web = 'yooo';console.log(web);var ...
- let/const 的变量提升与暂时性死区
从一道面试题说起 请说出 let,const,var 的区别 大部分的回答是这样的,甚至很多博客中的答案也是这样的: let/const 提供了块级作用域 let 不能重复定义 var 有变量提升,l ...
- 详解JS中的TDZ(暂时性死区)
TDZ(temporal dead zone)暂时性死区 来源: ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域.凡是在声明之前就使用 ...
- js 详解es6 let TDZ(暂时性死区)
暂时性死区产生的原因: ES6 明确规定,如果区块中存在 let 和 const 语句(注意:let.const语句不存在变量提升),这个区块对这些命令声明的变量,从一开始就形成了封闭作用域.凡是在声 ...
- 理解JavaScriptES6中的TDZ(暂时性死区)
什么是TDZ Temporal Dead Zone(TDZ)是ES6中对作用域新的专用语义.TDZ名词并没有明确地写在ES6的标准文件中,一开始是出现在ES Discussion讨论区中,是对于某些遇 ...
最新文章
- Cisco堆叠交换机序号的改变
- VS中使用NuGet安装依赖时提示:无法安装程序包“xxx”。你正在尝试将此程序包安装到目标为“.NETFramework,Version=v4.5”的项目中
- GDCM:读取和打印DICOM的属性的测试程序
- CC254x--API
- 工作流实战_23_flowable 任务监听器 事件监听器
- 唯美好看的动态个人鹿鸣404单页HTML源码
- 华为与万达签订5G战略合作协议 推动5G商业场景应用
- router中获取vuex_Vue 中 Axios 的封装和 API 接口的管理
- 通过在群晖上安装虚拟机,实现群晖与115网盘的双向同步
- qq机器人智能聊天插件源码
- 【数据结构】二叉树 —— 遍历二叉树 + 递归的分治(链式存储)
- Debian 7 安装metasploit
- latex formula
- 你们要的炒股软件来啦,同花顺等 6 款工具类软件上架优麒麟软件商店
- 侯捷C++视频(百度云盘)
- linux crontab : mailed 85 bytes of output but got status 0x004b#012 问题
- html基础常用标签,HTML基础(三)常用标签-by Haley(示例代码)
- 干货 | 区块链项目估值的逻辑和误区
- 使用trashcan恢复linux下误删的文件
- FileOutputStream、OutputStreamWriter、BufferedWriter的区别和用法
热门文章
- php is_subclass_of,PHP is_subclass_of() 函数用法及示例
- java 内存 监控_Java内存监视
- 实习每日总结_20161219
- 自己建网站时要注意哪些细节
- 从钉钉后台对接考勤打卡信息(仅供参考)
- 一文讲透智慧农业,一滴水也没有的超级干货
- 粒子滤波(particle filtering)梳理
- Open3D Intrinsic shape signatures (ISS) 固有形状特征码
- 禁用Android底部虚拟按键
- 【Android系统】虚拟按键 平板设备中重叠的问题