什么是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…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...