javascript变量提升是什么_let和const如何改变了这种现象?
发布时间 - 2026-01-11 00:00:00 点击率:次变量提升只提升var声明(不包括赋值),let/const虽声明提升但受TDZ限制,访问会报错;var函数作用域且可重复声明,let/const块级作用域且不可重复声明。
变量提升(Hoisting)到底提升了什么?
JavaScript 中的“变量提升”不是把变量声明和赋值一起挪到顶部,而是只把 var 声明部分(不包括初始化)移到当前作用域顶部,赋值仍保留在原位置。这意味着你能在声明前访问 var 变量,但值是 undefined,而不是报错。
常见错误现象:
- 以为
console.log(a)会报ReferenceError,结果输出undefined - 在函数内用
var声明同名变量,意外覆盖了外层变量却没察觉
console.log(a); // undefined var a = 123;
let 和 const 为什么不再“提升”?
它们确实也经历了声明提升,但被放入了「暂时性死区」(Temporal Dead Zone, TDZ)。也就是说:声明被提升,但直到实际执行到那行代码前,都不能读写该变量——任何访问都会抛出 ReferenceError。
关键区别在于:TDZ 强制你必须「先声明、后使用」,而 var 允许「先用、后声明」(只是值为 undefined)。
使用场景提醒:
- 函数参数默认值中引用
let/const声明的变量,会立即触发 TDZ 错误 -
for循环中用let声明计数器,每次迭代都有独立绑定,避免闭包陷阱 -
const声明的对象属性仍可修改,它只限制「重新赋值」,不冻结内容
console.log(b); // ReferenceError: Cannot access 'b' before initialization let b = 456;
var、let、const 的作用域与重复声明规则
三者的作用域行为差异比提升更直接影响代码逻辑:
-
var是函数作用域(或全局),允许重复声明;在块(如if或for)中声明会被提升到函数顶部 -
let和const是块级作用域,不允许重复声明(同一作用域下),且const必须初始化 -
var在全局作用域下会成为window属性(浏览器环境),let/const不会
if (true) {
var x = 1;
let y = 2;
}
console.log(x); // 1 —— var 被提升到函数/全局作用域
console.log(y); // ReferenceError —— y 只存在于 if 块内
容易被忽略的细节:函数声明 vs 函数表达式
函数声明(function foo() {})会被完全提升(声明 + 定义),而函数表达式(const foo = function() {})按 const 规则处理,受 T
DZ 约束。
这也意味着:
- 用
var写函数表达式(var foo = function() {})只会提升var foo,foo值仍是undefined,直到执行到赋值行 - 箭头函数始终是表达式,无论用
let还是const声明,都遵循 TDZ - 类声明(
class Foo {})也受 TDZ 约束,不能在声明前使用
真正要警惕的,不是“有没有提升”,而是“提升后能不能安全访问”。let 和 const 把隐式错误变成了显式报错,但前提是你要意识到自己正处在块内、参数默认值里,或者 eval 上下文中——这些地方 TDZ 的边界并不总是直观。
# javascript
# java
# 浏览器
# access
# win
# 区别
# 作用域
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
昵图网官网入口 昵图网素材平台官方入口
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
深圳网站制作平台,深圳市做网站好的公司有哪些?
Laravel怎么使用artisan命令缓存配置和视图
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
如何彻底卸载建站之星软件?
Laravel安装步骤详细教程_Laravel环境搭建指南
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Python文本处理实践_日志清洗解析【指导】
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
网站制作免费,什么网站能看正片电影?
千库网官网入口推荐 千库网设计创意平台入口
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel如何升级到最新版本?(升级指南和步骤)
浅析上传头像示例及其注意事项
如何快速生成可下载的建站源码工具?
Laravel模型事件有哪些_Laravel Model Event生命周期详解
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何在香港免费服务器上快速搭建网站?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
详解jQuery中的事件
如何快速使用云服务器搭建个人网站?
Laravel如何实现一对一模型关联?(Eloquent示例)
如何在阿里云域名上完成建站全流程?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
怎么用AI帮你为初创公司进行市场定位分析?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Bootstrap整体框架之JavaScript插件架构
HTML 中如何正确使用模板变量为元素的 name 属性赋值
微信h5制作网站有哪些,免费微信H5页面制作工具?
linux写shell需要注意的问题(必看)
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
如何快速生成专业多端适配建站电话?
郑州企业网站制作公司,郑州招聘网站有哪些?
如何用PHP快速搭建高效网站?分步指南
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
如何在阿里云部署织梦网站?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
javascript读取文本节点方法小结
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
北京的网站制作公司有哪些,哪个视频网站最好?
如何在云指建站中生成FTP站点?
EditPlus中的正则表达式 实战(4)
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
nginx修改上传文件大小限制的方法

