什么是变量提升?
变量提升(Hoisting) 是 JavaScript 引擎在代码执行前的一个特殊行为,它会将变量声明和函数声明自动移动到当前作用域的顶部。但需要注意的是,只有声明会被提升,赋值操作不会提升。
核心概念
-
变量声明提升(仅
var
和函数参数):
• 用var
声明的变量会被提升到作用域顶部,但赋值留在原地。• 用
let
和const
声明的变量也会被提升,但不会初始化,导致暂时性死区(TDZ)。 -
函数声明提升:
• 函数声明(非函数表达式)整体被提升,包括函数体。
示例代码
var
的变量提升
javascript
复制
console.log(a); // 输出 undefined(变量声明被提升,但未赋值)
var a = 10;
等价于:
javascript
复制
var a; // 声明提升到顶部
console.log(a); // undefined
a = 10; // 赋值留在原地
let
和const
的暂时性死区
javascript
复制
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 20;
虽然 b
的声明被提升,但在声明前访问会触发错误。
- 函数声明提升
javascript
复制
foo(); // 输出 "Hello"
function foo() {console.log("Hello");
}
等价于:
javascript
复制
function foo() { // 函数声明整体提升console.log("Hello");
}
foo();
注意事项
-
函数表达式不会被提升:
javascript
复制
bar(); // 报错:bar is not a function var bar = function() { /* ... */ };
此时
bar
是变量,提升的是变量声明(值为undefined
)。 -
函数声明优先级高于变量声明:
javascript
复制
console.log(typeof a); // 输出 "function" var a = 3; function a() {}
为什么会有变量提升?
JavaScript 引擎在执行代码前会经历两个阶段:
- 编译阶段:解析代码,提升变量和函数声明。
- 执行阶段:逐行执行代码。
如何避免问题?
- 优先使用
let
和const
:避免var
的隐式全局变量和提升问题。 - 声明变量时先写后用:
javascript
复制
let c = 30; console.log(c); // 正常输出 30
- 使用严格模式(
"use strict"
):禁止意外的全局变量。
总结
• 变量提升是 JavaScript 的历史遗留特性,可能导致意外行为。
• var
会提升声明但初始化为 undefined
,let
/const
存在暂时性死区。
• 函数声明整体提升,函数表达式不会被提升。
• 现代开发中推荐使用 let
/const
和函数表达式(箭头函数)来规避问题。
相关文章:
什么是变量提升?
变量提升(Hoisting) 是 JavaScript 引擎在代码执行前的一个特殊行为,它会将变量声明和函数声明自动移动到当前作用域的顶部。但需要注意的是,只有声明会被提升,赋值操作不会提升。 核心概念 变量声明提升&…...
Java大师成长计划之第15天:Java线程基础
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在现代软件开发中,多线程…...
中小企业设备预测性维护:从技术原理到中讯烛龙实践落地指南
在工业 4.0 与智能制造浪潮的推动下,中小企业正面临设备管理模式的深刻变革。传统的事后维修与预防性维护策略,因缺乏数据驱动与智能决策能力,已难以满足企业降本增效的核心诉求。据 Gartner 统计,非计划停机导致的生产损失平均每…...
mysql 复习
mysql定义与架构 数据库是按照数据结构来组织、存储和管理数据的仓库,方便我们增删查改。MySQL有客户端和服务器端,基于网络服务的,3306端口处于监听状态。 数据库的存储介质有以下两种: 磁盘,比如MySQL就是一种磁盘…...
高低比率策略
本策略的核心在于运用技术指标结合基本规则进行交易决策,旨在通过高低比率策略捕捉市场的超买和超卖信号,以此指导交易行为。 一、交易逻辑思路 1. 指标计算: - 本策略首先通过EMA(指数移动平均)计算快线和慢线的值&am…...
python线上学习进度报告
一、mooc学习 二、python123学习...
深入剖析ThreadLocal:原理、应用与最佳实践
深入剖析ThreadLocal:原理、应用与最佳实践 一、ThreadLocal的本质与价值 1.1 什么是ThreadLocal? ThreadLocal是Java提供的线程本地变量机制,允许每个线程拥有独立的变量副本,实现线程间的数据隔离。它通过“空间换时间”的方式…...
nginx 配置后端健康检查模块
nginx自带的针对后端节点健康检查的功能比较简单,通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的参数来完成,当后端节点出现故障时,自动切换到健康节点来提供访问。但是nginx不能事先知道后端节点状态是否健康,后端即使有不健康节点,负载均…...
路由交换实验
案例一:实施和配置RIPV2 1.给AR1配置接口 查看R1接口配置情况 2.配置三台路由的RIP协议,版本为version2 ,关闭自动汇总,通告所有的直连接口 案例二:配置多区域的OSPF协议 1.配置R1的接口IP地址参数 2.配置r2,r3的接口参…...
主成分分析(PCA)是什么?简易理解版
文章目录 一、PCA的本质与核心价值二、数据中的"重要方向":理解变异性三、主成分的数学基础四、荷载向量的深入理解五、PCA的计算过程详解5.1 数据预处理5.2 计算协方差矩阵5.3 特征分解5.4 主成分得分计算 六、PCA的实际应用解读七、PCA的工具与实现7.1 …...
Linux常用命令34——uname显示系统内核信息
在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,uname命令来自英文词组UNIX name的缩写,其功能是查看系统主机名、内核及硬件架构等信息。如果不加任何参数,默认仅显示系统内核名称(相当于-s参数…...
Linux下使用openssh搭建sftp服务
创建 SFTP 用户组 为 SFTP 用户创建一个专用组: sudo groupadd sftpusers 创建 SFTP 用户 创建 SFTP 用户并将其添加到 sftpusers 组,同时指定用户的主目录和禁止 shell 访问: sudo useradd -g sftpusers -s /sbin/nologin username sud…...
C++ 复习(一)
命名空间 概念 : 命名空间的主要作用是创建一个新的作用域 里面可以放函数 变量 定义 为了防止命名冲突 实现 : 通过使用namespace 空间名 {} 在大括号中添加 内容 1. 这里命名空间允许嵌套 2. 在同一个工程中允许存在多个同名的命名空间 在最后编译…...
主备Smart Link + Monitor Link组网技术详细配置
1.实验拓扑 2.使用设备 eNSP模拟建议下行设备三台使用S3700模拟(全部使用S5700可能会出现流量丢失等异常问题。) 3.实验配置 [SW1]dis cu # sysname SW1 # vlan batch 100 110 # interface Ethernet0/0/1port link-type accessport default vlan 100 …...
【5G通信】redcap和bwp 随手记
在5G通信中,BWP(Bandwidth Part)是一种技术,允许终端设备在不同的带宽部分上进行通信,从而提高频谱效率和灵活性。BWP可以分为初始BWP(Initial BWP)、默认BWP(Default BWP࿰…...
第三天 车联网云架构
一、车联网技术演进与行业变革 1.1 从传统Telematics到智能网联汽车 当我们驾驶着搭载智能网联系统的汽车时,车辆每秒会产生超过1GB的数据流量。这些数据包括: 高精度地图的实时更新ADAS传感器采集的环境信息车载娱乐系统交互数据车辆状态监控信息 传…...
手撕基于AMQP协议的简易消息队列-7(客户端模块的编写)
在MQClient中编写客户端模块代码 在MQClient中编写makefile文件来编译客户端模块 .PHONY:all all:PublichClient ConsumeClient PublichClient : PublichClient.cpp ../MQCommon/request.pb.cc ../MQCommon/message.pb.cc ../ThirdLib/lib/include/muduo/protobuf/codec.ccg …...
Spring Security(笔记)
第一步: 首先使用Intellij IDEA创建一个Spring Boot项目,JDK选择自己安装的1.8。点击Next后,编辑项目信息。然后跳转到选择依赖页面。 第二步: 添加Spring Security、Spring Web、Thymeleaf三个依赖。完成后等待项目构建完成。…...
通义灵码编码插件支持MCP
通义灵码MCP功能集成概述 通义灵码已深度集成魔搭社区(ModelScope)的MCP(Model Context Protocol)服务,为开发者提供了在IDE中直接调用AI能力的便捷通道。MCP作为标准化协议,通过定义Resources、Prompts和…...
问题 | 当前计算机视觉迫切解决的问题
当前计算机视觉领域虽然在技术上取得了显著进展,但仍面临一系列关键挑战。结合最新研究与应用现状,以下是最迫切需要解决的几大问题: 1. 数据质量与多样性不足 高质量标注数据的获取:训练高效模型依赖大量精准标注的数据&#x…...
C++ STL入门:vecto容器
C STL 系列入门:vector 动态数组 一、vector 容器核心特性 vector 是 C 标准库提供的动态数组容器,具有以下显著优势: 自动扩容机制:当插入元素超出当前容量时,自动申请新内存并迁移数据随机访问效率:支持…...
Java 线程全面概述
Java 线程全面概述 线程是程序执行的最小单元,是操作系统能够调度的最小单位。Java 提供了完善的线程支持,下面从基础概念到高级特性进行全面解析。 一、线程基础概念 1. 线程 vs 进程 特性进程线程资源占用独立内存空间共享进程内存切换成本高&#…...
高效文件夹迁移工具,轻松实现批量文件管理
软件介绍 DirMapper是一款专注于文件夹迁移的工具,可以快速完成文件的批量整理与位置调整。 功能特点 这款文件夹迁移工具提供两种操作模式:复制模式和移动模式,用户可以根据需求自行选择。如果需要保留原文件,可以选择复…...
sherpa:介绍
更多内容:XiaoJ的知识星球 目录 1. sherpa 介绍 1. sherpa 介绍 sherpa是 Next-gen Kaldi 项目的部署框架。 sherpa 支持在各种平台上部署与语音相关的预训练模型,并提供多种语言绑定。 目前,sherpa 拥有以下子项目: k2-fsa/sh…...
Android Studio Gradle 中 只显示 Tasks 中没有 build 选项解决办法
一、问题描述 想把项目中某一个模块的代码单独打包成 aar ,之前是点击 AndroidStudio 右侧的 Gradle 选项,然后再点击需要打包的模块找到 build 进行打包,但是却发现没有 build 选项。 二、解决办法 1、设置中勾选 Configure all Gradle tasks… 选项 …...
手撕基于AMQP协议的简易消息队列-6(服务端模块的编写)
在MQServer中编写服务端模块代码 在MQServer中编写makefile文件来编译服务端模块 .PHONY: server CFLAG -I../ThirdLib/lib/include LFLAG -L../ThirdLib/lib/lib -lgtest -lprotobuf -lsqlite3 -pthread -lmuduo_net -lmuduo_base -lz server:server.cpp ../MQCommon/messag…...
面试实践AND面经热点题目总结
1、对于Rocketmq消息积压、丢失如何解决? 消息积压原因以及解决方案 🎯 产生原因: 消费者处理能力弱,消费速度远低于生产速度; 网络不稳定,消费者拉取消息失败; 消费端异常(如处理…...
MySQL基础关键_012_事务
目 录 一、概述 二、ACID 四大特性 三、MySQL 事务 四、事务隔离级别 1.说明 2.现象 (1)脏读 (2)不可重复读 (3)幻读 3.查看隔离级别 4.设置隔离级别 5.隔离级别 (1)初始…...
Missashe考研日记-day35
Missashe考研日记-day35 1 专业课408 学习时间:3h学习内容: 完结撒花!!今天把OS最后一节的内容学完了,操作系统也算是告一段落了,接下来是计网时间!不过计网我是上学期才学过的,当…...
如何添加二级域名
在 华为云 上添加二级域名(如 sub.example.com)主要涉及 DNS解析配置 和 服务器绑定 两个步骤。以下是详细操作指南: 一、前提条件 已拥有 主域名(如 example.com)并完成 ICP备案(若服务器在中国大陆&#…...
【数据结构】01Trie
什么是 01Trie? 01Trie是字典树的一种变种,其只有两种情况,即 0 和 1,实现方式其实和字典树是一样的 有什么用呢? 其一般用于解决异或问题,是一种快速的数据结构,某些情况下可以无脑套用 实现方式&#…...
使用 CDN 在国内加载本地 PDF 文件并处理批注:PDF.js 5.x 实战指南
PDF.js 是一个强大的开源 JavaScript 库,用于在 Web 浏览器中渲染 PDF 文件。它由 Mozilla 开发,能够将 PDF 文档绘制到 HTML5 Canvas 或 SVG 上,无需任何本机代码或浏览器插件。对于许多需要在网页中展示 PDF 内容的应用场景来说,…...
SpringBoot指定项目层日志记录
1、新建一个Springboot项目,添加Lombok依赖(注意:这里使用的Lombok下的Slf4j快速日志记录方式) <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependenc…...
使用Mathematica内置函数绘制Sierpinski地毯
除了SierpinskiCurve之外,Mathematica还内置了SierpinskiMesh这个函数,用来绘制地毯。 SierpinskiMesh[n] gives a mesh region representing the n-step Sierpiński triangle. SierpinskiMesh[n,d] gives the n-step Sierpiński sponge in dimension…...
CMake笔记(简易教程)
CMake笔记 概述(需要提前了解的知识) 一个c/c程序从代码到生成二进制文件,需要经历的几个关键步骤:预编译(预处理)、编译、汇编、连接 【编译链接的几个步骤】 编译器:目前市面常见的编译器有…...
现代健康养生新范式:多维度守护身心活力
在快节奏的现代生活中,健康养生是维持高品质生活的关键。从环境调节到生活习惯养成,多个维度的协同发力,才能为健康注入持久动力。 良好的生活环境是健康的基础。室内空气流通至关重要,每天开窗通风 2-3 次,每次 30…...
推测式思维树:让大模型快速完成复杂推理
论文标题 Accelerating Large Language Model Reasoning via Speculative Search 论文地址 https://www.arxiv.org/pdf/2505.02865 作者背景 中科大,华为诺亚方舟实验室,天津大学 ICML 2025接收 动机 之前介绍过多篇投机解码(推测式解…...
软考错题(三)
telnet协议是一种基于TCP的远程登录协议 占用辅助空间最多的是归并排序 直接插入,堆排,简单选择,冒泡的空间复杂度是O(1) 快排是O(logn) 归并是O(n) B树的叶子节点通过指针链接为有序表,不是b-树 python中切片语法[start,end,s…...
注解的定义
一、理论说明 1. 注解的定义 Java 注解是从 JDK 5.0 开始引入的一种元数据机制,它可以为代码添加额外的信息,这些信息不影响程序的运行逻辑,但可以在编译期、类加载期或运行期被读取和处理。注解本质上是一种特殊的接口,所有注解…...
企业微信自建消息推送应用
企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求,所以配置一个应用专门用来推送消息。实现过程大致为:服务器生成每天的报告,通过调用API来发送消息。以前一直都是发邮件,整个邮箱里全是报告文件,…...
swagger3融入springboot
标签: 放controller上面 Api(description "xxx") 放方法上面 Operation(summary "xxx") 引入: 我用的是swagger3.X 需要在yml配置文件中加上: spring:mvc:pathmatch:matching-strategy: ant_path_matcher 然后生…...
CH32V208GBU6沁恒绑定配对获取静态地址
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
[计算机科学#11]:编程语言简史,从二进制到简约表达的华丽转身,造就原因——“懒”
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要: 由于早期的编程需要直接操作硬件,例如使…...
Kubernetes HPA 深度解析:生产环境自动扩缩容实战指南
一、HPA 核心原理剖析 1. 运作机制三步曲 (图示:指标采集 → 决策计算 → 执行扩缩容的完整闭环) 指标采集层:通过 Metrics Server/Prometheus 等组件实时收集 CPU、内存或自定义指标决策计算层:根据当前指标值与目标阈值的比例计算所需副本…...
Matlab 四分之一车体被动和模糊控制对比
1、内容简介 Matlab215-四分之一车体被动和模糊控制对比 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
pm2如何执行脚本批量启动多个服务
在 PM2 中批量启动多个服务,可以通过以下几种高效方式实现,具体操作如下: 方法1:使用 ecosystem.config.js 配置文件(推荐) 步骤1:生成配置文件 在项目根目录运行以下命令,生成模板…...
Debian系统详解
以下是关于 Debian 操作系统 的超详细深度解析,涵盖历史、架构、功能特性、管理细节及应用场景等方面,帮助你全面掌握这一经典 Linux 发行版: 一、Debian 概述:开源社区的基石 1. 历史与定位 • 诞生:1993 年由 Ian…...
Dify X 奇墨科技,让AI大模型从“巨头专属”变为“触手可及”
AI大模型和AI Agent蓬勃发展,企业比拼的已不仅是AI技术储备,更是AI应用落地的实战能力。奇墨科技正式成为 AI 应用开发平台Dify中国大陆区企业版合作伙伴,帮助企业更便捷地接触到Dify并使用其开发AI应用。 Dify 是一款简单易用的 LLM 应用开…...
CSS相对定位与绝对定位
在网页设计里,相对定位(Relative Positioning)和绝对定位(Absolute Positioning)是 CSS(层叠样式表)里控制元素位置的关键手段。下面为你详细讲解它们的概念、特点与应用场景。 相对定位 概念…...
正则表达式(Regular Expression)详解
正则表达式(简称"regex"或"regexp")是一种强大的文本模式匹配工具,它使用特定语法来描述、匹配和操作字符串。 基本概念 正则表达式是由普通字符(如字母a到z)和特殊字符(称为"元…...