JavaScript变量提升指声明被编译阶段提前处理至作用域顶部,但仅声明被提升、赋值保留原位;var声明提升后值为undefined,函数声明整体提升,函数表达式仅变量名提升,let/const因TDZ在声明前访问抛出ReferenceError。
JavaScript变量提升(Hoisting)是指变量和函数声明在代码执行前被“移动”到其作用域顶部的现象。它不是真正的物理移动,而是JavaScript引擎在编译阶段将声明部分提前处理的结果。这种机制只影响声明,不包括初始化或赋值。

使用var声明的变量,会被提升到作用域顶部,但值仍为undefined;而赋值操作保留在原位置。
console.log(a); // undefined(不是ReferenceError) var a = 10; console.log(a); // 10
上面的代码实际等价于:
var a; // 声明被提升 console.log(a); // 此时a尚未赋值,输出undefined a = 10; // 赋值保留在原处 console.log(a);
函数声明(function foo() {...})不仅名称被提升,函数定义也一同被提升,因此可以在声明前调用。
foo(); // 正常输出"hello"
function foo() {
console.log("hello");
}
但函数表达式(var foo = function() {...})只提升变量名,不提升函数体,调用会报错:
bar(); // TypeError: bar is not a function
var bar = function() {
console.log("world");
};
let和const声明不会被提升到作用域顶部,但在声明之前访问它们会抛出ReferenceError,而不是返回undefined。这是因为它们存在“暂时性死区”——从块级作用域开始到声明语句执行前的区域。
console.log(x); // ReferenceError: Cannot access 'x' before initialization let x = 5;
let变量也不安全(同样报错),而var下是"undefined"
JavaScript引擎(如V8)在执行代码前会先进行编译(更准确说是“解析+预处理”),此时完成作用域分析、函数声明收集、var变量声明注册等。这是语言设计的历史选择,早期为了支持函数间相互调用(如递归或前置调用),让函数声明可被提前识别。
let/const后,通过TDZ修正了var带来的易错性const,需要重赋值时用let,避免var
# javascript
# es6
# java
# access
# 作用域
# 为什么
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】
mac怎么分屏_MAC双屏显示与分屏操作技巧【指南】
Linux怎么查找死循环进程_Linux系统负载分析与进程彻底结束【教程】
Python正则表达式实战_模式匹配说明【教程】
如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法
c++ atoi和atof函数用法_c++字符数组转数字
Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录
php本地部署后数据库连接报错_1045accessdenied错误解决方法详解【汇总】
如何提升Golang程序I/O性能_Golang I/O密集型程序优化示例
Windows10如何更改日期格式_Win10区域设置短日期修改
c++中如何使用虚函数实现多态_c++多态性实现原理
如何使用Golang处理网络超时错误_Golang请求超时异常处理方法
Go 语言标准库为何不提供泛型 Contains 方法?
php怎么操作Redis_Redis扩展连接与基本命令使用方法【方法】
Win10如何更改开机密码_Windows10登录选项更改密码
Python装饰器设计思路_功能增强机制说明【指导】
如何在Golang中编写端到端测试_Golang E2E测试流程示例
用lighttpd能运行php吗_lighttpd配置php步骤【教程】
Win11时间格式怎么改成12小时制 Win11时间格式切换教程【步骤】
c++中的CRTP是什么 c++奇异递归模板模式【进阶】
php485返回空数组怎么回事_php485数据接收为空排查指南【详解】
Win11怎么关闭键盘按键音_Win11禁用打字声音反馈【教程】
c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
c++怎么使用std::tuple存储多元组数据_c++ 11获取元素与解包操作【技巧】
XSLT怎么生成动态的HTML属性名和标签名
C#如何使用Channel C#通道实现异步通信
Python代码测试策略_质量保障解析【教程】
如何在包含多值的列中精准搜索指定演员?
微信JSAPI支付回调PHP怎么接收_处理JSAPI异步通知数据方法【指南】
WindowsUSB驱动安装异常怎么办_USB驱动重建与恢复教程
Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何在 Go 中可靠地测试含 time.Time 字段的结构体
Go 语言标准库为何不提供泛型 Contains 方法:设计哲学与类型系统约束
Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】
如何优化Golang程序CPU性能_Golang CPU密集型任务优化方法
Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】
php怎么下载安装并配置环境变量_命令行调用PHP技巧【技巧】
Win11相机打不开提示错误怎么修_相机权限开启与驱动修复【影像修复】
Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】
Win11怎么关闭粘滞键_彻底禁用Windows 11连按Shift粘滞键【步骤】
短链接还原php提示内存不足_调整PHP内存限制设置【技巧】
Mac如何整理桌面文件_Mac使用堆栈功能一键整理
Win11声音忽大忽小怎么办 Win11音频增强功能关闭教程【修复】
Win11如何更改用户账户文件夹名称 Win11修改C:Users用户名【终极教程】
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Windows 11怎么更改锁屏超时时间_Windows 11电源选项中设置屏幕关闭时间
2025-12-27
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。