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;

letconst 为什么不再“提升”?

它们确实也经历了声明提升,但被放入了「暂时性死区」(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;

varletconst 的作用域与重复声明规则

三者的作用域行为差异比提升更直接影响代码逻辑:

  • var 是函数作用域(或全局),允许重复声明;在块(如 iffor)中声明会被提升到函数顶部
  • letconst 是块级作用域,不允许重复声明(同一作用域下),且 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 规则处理,受 TDZ 约束。

这也意味着:

  • var 写函数表达式(var foo = function() {})只会提升 var foofoo 值仍是 undefined,直到执行到赋值行
  • 箭头函数始终是表达式,无论用 let 还是 const 声明,都遵循 TDZ
  • 类声明(class Foo {})也受 TDZ 约束,不能在声明前使用

真正要警惕的,不是“有没有提升”,而是“提升后能不能安全访问”。letconst 把隐式错误变成了显式报错,但前提是你要意识到自己正处在块内、参数默认值里,或者 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修改上传文件大小限制的方法