提升(Hoisting)和暂时死区(TDZ)在实践中的应用

news2024/11/24 17:37:02

变量提升

● 首先我们先声明三个变量,并在声明之前去使用这个变量

console.log(me);
console.log(job);
console.log(year);

var me = 'IT知识一享';
let job = 'teacher';
const year = 1991;

在这里插入图片描述

使用var声明变量,变量声明会被提升到作用域的顶部,但是变量赋值不会。向let和const的变量就处于暂时死区

函数的提升

● 现在我们首先创建一个函数,用三种不同的方式

function addDecl(a, b) {
  return a + b;
}

const addExpr = function (a, b) {
  return a + b;
};

const addArrow = (a, b) => a + b;

● 接着我们直接调用它

console.log(addDecl(2, 8));

function addDecl(a, b) {
  return a + b;
}

const addExpr = function (a, b) {
  return a + b;
};

const addArrow = (a, b) => a + b;

在这里插入图片描述

● 接着调用表达式的函数

console.log(addDecl(2, 8));
console.log(addExpr(2, 8));

function addDecl(a, b) {
  return a + b;
}

const addExpr = function (a, b) {
  return a + b;
};

const addArrow = (a, b) => a + b;

在这里插入图片描述

这是因为在函数表达式中,函数仅仅是变量addExpr的一个值,和变量提升一样,无法在他之前去调用它!

● 接着调用箭头函数

console.log(addDecl(2, 8));
// console.log(addExpr(2, 8));
console.log(addArrow(2, 8));

function addDecl(a, b) {
  return a + b;
}

const addExpr = function (a, b) {
  return a + b;
};

const addArrow = (a, b) => a + b;

结果和函数表达式的结果一样,原因也和函数表达式的原因一样!addDecl和addExpr处于暂时死区!

● 那如果我们把函数表达式和箭头函数改变为var去声明呢?

var addArrow = (a, b) => a + b;

在这里插入图片描述

仔细看这个报错,和之前的不一样,原因是var的函数声明会被提升,但是变量赋值并不会,所以当我们使用console.log(addArrow(2, 8));去调用它的时候,addArrow的这个函数并不存在,程序更不会去识别它是一个函数!函数表达式也是同样的道理!

window全局对象

var x = 1;
let y = 2;
const z = 3;

在浏览器环境下,JavaScript提供了window对象,它代表了浏览器的窗口或标签页。window对象是全局对象,在浏览器环境中的任何地方都可以直接访问它。
● 我们可以在控制台上输入window,在直接调用它
在这里插入图片描述
在这里插入图片描述

我们发现用var声明的变量可以在window全局对象中找到,而用let和const声明的对象则找不到!
● 我们也可以用代码去验证一下

var x = 1;
let y = 2;
const z = 3;

console.log(x === window.x);
console.log(y === window.y);
console.log(z === window.z);

在这里插入图片描述

举例

● 假设现在我们是一个电子商务公司,现在需要实现一个功能,可以删除所有的产品。我们用函数来简单的表示

function deleteShoppingCart() {
  console.log('All products deleted!');
}

● 但是首先我们要确定现在商品的数量,假设为10,我们把它放入一个变量中

var numProducts = 10;

function deleteShoppingCart() {
  console.log('All products deleted!');
}

● 现在我们要去判断,如果有商品的话,我们需要去确认一下是否删除,因为删除所有是一个非常危险的操作,我们用if去实现一下

if(!numProducts) deleteShoppingCart(); 

var numProducts = 10;

function deleteShoppingCart() {
  console.log('All products deleted!');
}

注:10在布尔类型中为ture,!就是flase,不执行删除操作,看似代码好像没有什么问题
在这里插入图片描述

注:但是还是进行了删除的操作!为什么?因为if中的numProducts值用var在后面声明的,变量赋值并没有被提升,故if中的numProducts为undefined,布尔值为flase,!取反就是为true,所以还是执行了后面的函数代码!

最佳实践:

  1. 变量的声明尽量使用const,不要使用var,以免会有意外的发生;
  2. 变量声明放在代码的顶部,这样也是不违背常理的,也比较好看;
  3. 虽然函数声明的方式可以在前面调用,但是仍然不推荐在函数声明去调用函数;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1184033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】Generating Radiology Reports via Memory-driven Transformer (EMNLP 2020)

资料链接 论文原文:https://arxiv.org/pdf/2010.16056v2.pdf 代码链接(含数据集):https://github.com/cuhksz-nlp/R2Gen/ 背景与动机 这篇文章的标题是“Generating Radiology Reports via Memory-driven Transformer”&#xf…

[Linux/UOS]同一解决方案下的控制台程序依赖SO库的方法

该方法是基于VS2019的远程调试Linux的方案,使用的是UOS系统,本文不会去详述如何远程调试Linux和如何新建解决方案中的.so项目和.out项目 只关注于如何令.out项目依赖.so,并成功调用运行 以一个如上图结构的解决方案为例子,SysInfo…

开源库windows平台编译

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

论文阅读——变化检测

Viewpoint Integration and Registration with Vision Language Foundation Model for Image Change Understanding 只有fused adapter image encoder, viewpoint registration flow, semantic emphasizing module, 和 fully connected layer 训练,其他参数冻结。 F…

MeterSphere 任意文件读取漏洞(CVE-2023-25814)

MeterSphere 任意文件读取漏洞(CVE-2023-25814) 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: title"MeterSphere" 漏洞复现1. 构造poc2. 发送数据包3. 查看文件 免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地…

使用requests库来发送HTTP请求

首先,你需要安装Python的requests和BeautifulSoup库。然后,你可以使用requests库来发送HTTP请求,并用BeautifulSoup库来解析HTML文档。 import requests from bs4 import BeautifulSouprequests.get(http://www.91hfdm.com) 这行代码会向 ‘…

win11网络连接正常,但是无法正常上网

前言: 这个是一个win11的bug,好多人都遇到了,在孜孜不倦的百度下,毫无收获,终于是在抖音上看到有人分享的经验而解决了这个问题。 找到internet选项,然后点击打开 选择连接 将代理服务器中,为…

数据结构和算法是人工智能的基石

文章目录 1. 引言2. 主要内容3. 联合推荐4. 购买方式5. 总结 1. 引言 数据结构和算法是计算机科学的基石,是计算机的灵魂, 要想成为计算机专业人员,学习和掌握算法是十分必要的。不懂数据结构和算法的人不可能写出效率更高的代码。计算机科学…

leetcode:141. 环形链表

一、题目 函数原型: bool hasCycle(struct ListNode *head) 二、算法 判断不是环形链表,只需遍历链表找到空结点即可。 判断是环形链表,由于链表是环形的,遍历不会永远不会结束。所以要设置快慢指针,慢指针一次走一步&…

Linux开发板安装Ubuntu标准桌面环境(或其他桌面环境)

我们每入手一款开发板,一般配套的固件系统都会默认运行相应厂商定制的桌面环境(在一些桌面环境上定制的)。这个时候有些同学可能不喜欢厂商定制的桌面系统想要安装其他桌面系统比如我们虚拟机上常用的Ubuntu标准桌面系统(不建议因…

迅为龙芯3A5000主板,支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 VGA,可直连显示器

性能强 采用全国产龙芯3A5000处理器,基于龙芯自主指令系统 (LoongArch)的LA464微结构,并进一步提升频率,降低功耗,优化性能。 桥片 桥片采用龙芯 7A2000,支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 …

Word背景图片插入,5个简单方法快速完成!

“我想在我的Word文档里加入一些背景图片,让整个文档看起来更美观,但是我不知道应该怎么操作,希望大家帮帮我!” 很多朋友在工作和学习中都会用到Word来编写文章,为Word设置背景图片可以增加文档的吸引力和个性化。Wor…

java入坑之类加载器

一、类加载机制 1.1类加载过程 类加载是Java虚拟机将类的字节码数据从磁盘或网络中读入内存,并转换成在JVM中可以被执行的Java类型的过程。类加载器是Java虚拟机的重要组成部分,负责加载和解析类的字节码,将其转换成Java虚拟机中的类对象&am…

聊聊芯片制造中的金属杂质

在半导体制造过程中,杂质控制至关重要。杂质可以影响半导体的电导率,导致性能降低或者失效。在这些杂质中,金属杂质是最主要的来源之一,这些金属杂质可以通过扩散或者电迁移的方式在芯片中迅速扩散,因此控制金属杂质的…

iOS 让界面元素的文字随着语言的更改而变化——本地化文字跟随

在我的 App 内置的设置中,修改了语言,这时需要让当前界面的文本跟着改变语言。 解决方法是:添加一个观察者,观察 localize 本地语言的通知,然后一有变化就调用自定义的方法执行操作。(而设置中其实是改变了…

ebay、虾皮、Lazada、poshmark等跨境本土店群多账号如何做防关联

首先,需要了解跨境电商店铺关联及防关联的概念。关联指的是在跨境电商平台上,一个卖家拥有并运营多个账户的状态。而防关联则是指电商平台禁止卖家在同一环境下运营维护多个账号的行为。 那么,为什么要防范关联情况呢?其实&#…

CommunicationsException: Communications link failure

CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 通信异常:通信链路故障 最后一个成功发送到服务器的数据包是0毫秒前…

2010年4月27日Go生态洞察:JSON-RPC与接口的故事

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

VUE识别访问设备是移动端还是pc端

一、思路 有些网站需要区分手机端网页和pc端网页,做到不同设备访问不同的网页,增强用户的使用体验,可以在app.vue中作一个判断(navigator.userAgent),然后跳转不同的路由。 二、原理 navigator.userAgent …

3 Paimon数据湖中的表类型详解

更多Paimon数据湖内容请关注:https://edu.51cto.com/course/35051.html Paimon中支持多种表类型,下面我们来看一下。 3.1 全局维度 首先从全局维度来看,Paimon中的表类型可以大致划分为4种: 内部表、外部表、分区表和临时表。 …