什么是TDZ?在JavaScript当中怎么避免?
简介
TDZ 是 Temporal Dead Zone(暂时性死区)的缩写,是 JavaScript 中 let 和 const 变量的一个概念。在 ES6 中,let 和 const 引入了块级作用域(block scope),而它们声明的变量在声明之前的作用域中是不可访问的,这段不可访问的区域就是 暂时性死区。
什么是暂时性死区(TDZ)?
暂时性死区是指在变量声明之前访问该变量时会导致 ReferenceError 的现象。这是因为 let 和 const 声明的变量在作用域内的存在是“已知的”,但它们的实际值直到执行到声明语句时才会被初始化。
情况:
声明前不可访问:在变量声明之前,访问它会导致错误。
声明后可访问:一旦声明语句执行完毕,变量就进入了“活跃”状态,可以被正常访问。
TDZ 的触发情况
TDZ 会在你尝试 访问 变量而该变量还处于“暂时性死区”时触发。它并不会在你声明变量的时候触发,只会在你 使用 变量之前触发。以下是一些典型的情况:
- 在声明之前访问变量
- 在未声明的块级作用域内使用变量
- 在参数默认值中使用 TDZ 变量
示例 1:在声明之前访问变量
console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 10;
在这个例子中,let x 的声明使得 x 在其作用域中存在,但它还没有被初始化。在 let x 之前访问 x 会触发 TDZ 错误,抛出 ReferenceError。
示例 2:块级作用域中的 TDZ
{console.log(y); // ReferenceError: Cannot access 'y' before initializationlet y = 5;
}
在这个块级作用域中,y 在块的作用域范围内是“已知”的,但由于它的声明在后面,试图在 let y 之前访问 y 会触发 TDZ 错误。
示例 3:函数参数默认值中的 TDZ
function foo(x = y, y = 2) {return [x, y];
}
foo(); // ReferenceError: Cannot access ‘y’ before initialization
在这个例子中,函数的默认参数 x = y 依赖于参数 y,而 y 在 x 之前定义。这会导致 x 的默认值表达式在 y 被初始化之前使用 y,触发 TDZ 错误。
示例 4:const 的暂时性死区
const 声明的变量也存在 TDZ,并且它们的初始化是不可更改的(必须在声明时赋值)
console.log(z); // ReferenceError: Cannot access 'z' before initialization
const z = 20;
const z 的行为和 let 相似,z 在声明之前是不可访问的,会触发 TDZ 错误。
如何避免 TDZ 错误?
要避免 TDZ 错误,需要遵循以下几条规则:
- 声明前不要访问变量:始终在变量初始化后再进行使用。
- 在同一个块级作用域中声明和使用变量:避免在块作用域内跨越声明时使用变量。
- 小心参数默认值的顺序:在函数参数默认值中,要注意依赖的变量是否已经声明。
TDZ 的实际用途
TDZ 的主要作用是确保代码更加健壮并且有助于开发者避免一些常见的编程错误:
- 防止未初始化变量的使用:TDZ 确保在变量声明之前无法使用该变量,这减少了未初始化变量引发的潜在错误。
- 约束 const 和 let
变量的正确使用:由于 var 声明是函数作用域且会被提升,很多 JavaScript 开发者在 ES5
之前容易犯因变量提升(Hoisting)导致的错误。let 和 const 的 TDZ
强制要求开发者必须在变量声明之后再使用它们,从而避免这些问题 - 帮助代码可读性:TDZ
让代码更加明确,开发者在编写代码时可以清晰地知道哪些变量可用,哪些变量尚未初始化。 TDZ 与 var 的区别 与 let 和
const 相比,var 变量的行为不同,var 声明的变量会被提升到作用域的顶部,并且在初始化前,它们的值是
undefined,而不是处于 TDZ 中。
示例:
console.log(a); // undefined (变量提升,值为 undefined)var a = 10;
这里,var 声明的变量 a 在作用域内被提升,但它的值是 undefined,因此不会触发 TDZ 错误。相对比,如果使用 let 或 const,你会在声明前得到 ReferenceError。
相关文章:
什么是TDZ?在JavaScript当中怎么避免?
简介 TDZ 是 Temporal Dead Zone(暂时性死区)的缩写,是 JavaScript 中 let 和 const 变量的一个概念。在 ES6 中,let 和 const 引入了块级作用域(block scope),而它们声明的变量在声明之前的作…...

电阻分压电路:【图文讲解】
在电子电路中,电阻同样发挥着重要作用,同时也是一个最基本的元器件,电阻在电路中可以起到限流、分流、分压、发热的作用。 本节,我们重点来聊聊电阻的分压电路。如下图,是一个经典的电阻分压电路。 1:电路…...

【AI论文精读14】RAG论文综述2(微软亚研院 2409)P6(完)-隐含推理查询L4
AI知识点总结:【AI知识点】 AI论文精读、项目、思考:【AI修炼之路】 P1,P2,P3,P4,P5 六、隐藏推理查询(L4) ps:P2有四种查询(L1,L2,L3…...

FFmpeg的简单使用【Windows】--- 视频倒叙播放
实现功能 点击【选择文件】按钮可以选择视频,当点击【开始处理】按钮之后,会先将视频上传到服务器,然后开始进行视频倒叙播放的处理,当视频处理完毕之后会将输出的文件路径返回,同时在页面中将处理好的视频展示出来。…...
5分钟了解docker的Swarm机制
Swarm框架概述 1.1 Swarm的基本概念 在容器化技术的浪潮中,Docker无疑是最为耀眼的明星之一。而作为Docker生态系统中的重要组成部分,Swarm框架则扮演着至关重要的角色。Swarm,顾名思义,就是“群”的意思,它是一个开…...
python实现ppt转pdf
要实现将PPT文件转换为PDF文件,可以使用Python中的python-pptx库来读取PPT文件,并使用reportlab库来生成PDF。又或者,你也可以使用其他库如pypdf和pypptx等进行处理。 以下是一个使用unoconv工具以及Python的示例,可以将PPT转换为…...

VS2017 编译 SQLite3 动态库
首先官方下载源码: Tags sqlite/sqlite (github.com) 1.安装 VS2017 community edition 2.打开VS2017命令行工具 3.安装TCL 开发库,推荐 TCL 9.0 先下载源码: Tcl/Tk 9.0 使用vs2017编译tcl&...

Linux运维_Apache更改默认网站目录
1.首先创建目录 并且在目录下新建测试文件 index.html mkdir -p /home/test/ap_web 直接wget 百度官网 wget www.baidu.com 2.编辑配置文件 /etc/apache2/sites-available/000-default.conf(找到 DocumentRoot)更改为刚刚创建的目录 接着在添加 最终文件: 3.给文件 添加属…...
QT QString学习笔记
1.操作字符串 1.提供双元运算符 “” QString str1"cccc"; str1 str1 "ddddd"; qDebug()<<str1; qDebug()<<qPrintable(str1); 2.提供操作符 append() QString str1 "Good"; QString str2 "bye"; str1.append(str2); …...

4.stm32 GPIO输入
按键简介 按键:常见的输入设备,按下导通,松手断开 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动 传感器模块简介 传感器模块:传感器元件&#…...

GPT系列
GPT(Generative Pre-Training): 训练过程分两步:无监督预训练有监督微调 模型结构是decoder-only的12层transformer 1、预训练过程,窗口为k,根据前k-1个token预测第k个token,训练样本包括700…...

Chromium 前端window对象c++实现定义
前端中window.document window.alert()等一些列方法和对象在c对应定义如下: 1、window对象接口定义文件window.idl third_party\blink\renderer\core\frame\window.idl // https://html.spec.whatwg.org/C/#the-window-object// FIXME: explain all uses of [Cros…...
【力扣算法题】每天一道,健康生活
2024年10月8日 参考github网站:代码随想录 1.二分查找 leetcode 视频 class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size()-1;while(left<right){int middle (leftright)/2;if(nums[middle] …...

Android Camera系列(四):TextureView+OpenGL ES+Camera
别人贪婪时我恐惧,别人恐惧时我贪婪 Android Camera系列(一):SurfaceViewCamera Android Camera系列(二):TextureViewCamera Android Camera系列(三):GLSur…...

03 django管理系统 - 部门管理 - 部门列表
部门管理 首先我们需要在models里定义Dept类 # 创建部门表 class Dept(models.Model):name models.CharField(max_length100)head models.CharField(max_length100)phone models.CharField(max_length15)email models.EmailField()address models.CharField(max_length2…...
L1 Sklearn 衍生概念辨析 - 回归/分类/聚类/降维
背景 前文中我们提到: Scikit-Learn 库的算法主要有四类:分类、回归、聚类、降维: 回归:线性回归、决策树回归、SVM回归、KNN 回归;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees。…...

【畅捷通-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

TCP IP网络编程
文章目录 TCP IP网络编程一、基础知识(TCP)1)Linux1. socket()2.bind()2.1前提2.2字节序与网络字节序2.3 字节序转换2.4 字符串信息转化成网络字节序的整数型2.5 INADDR_ANY 3.listen()4.accept()5.connect()6.案例小结6.1服务器端6.2 客户端…...

libssh2编译部署详解
libssh2编译部署详解 一、准备工作二、编译libssh2方法一:使用Autotools构建方法二:使用CMake构建三、验证安装四、使用libssh2五、结论libssh2是一个用于实现SSH2协议的开源库,它支持建立安全的远程连接、传输文件等操作。本文将详细介绍如何在Linux系统下编译和部署libssh…...
IPv4数据报的首部格式 -计算机网络
IPv4数据报的首部格式 Day22. IPv4数据报的首部格式 -计算机网络_4字节的整数倍-CSDN博客 IP数据报首部是4字节的整数倍 🌿版本: 占4比特,表示IP协议的版本通信双方使用的IP协议必须一致,目前广泛使用的IP协议版本号上4…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...