什么是变量提升_let和var在此有何区别

发布时间 - 2026-01-11 00:00:00    点击率:
变量提升是JavaScript引擎在创建阶段将var和function声明提升至作用域顶部,但不提升赋值;let/const虽声明提升却不初始化,导致TDZ内访问报错。

变量提升到底是什么?

变量提升(Hoisting)不是“代码被移动了”,而是 JavaScript 引擎在执行前的「创建阶段」把声明收集到作用域顶部的行为。关键在于:只提升 varfunction 的声明,不提升赋值;而 letconst 虽然也“提升声明”,但不会初始化——这就引出了「暂时性死区」(TDZ)。

var 提升:能访问但值是 undefined

这是最常踩坑的地方:你以为没声明就不能用,结果它默默返回 undefined,还不会报错,导致逻辑出错却难定位。

console.log(a); // undefined(不报错)
var a = 10;
  • 引擎实际做了:var a; 提升到作用域顶部,初始值为 undefined
  • 赋值 a = 10 仍留在原位置,执行时才发生
  • 在函数内、if 块里、循环中都一样——只要在同一个函数作用域,就可提前读取

let 提升:一碰就报错的“禁区”

let 变量在声明语句执行前处于「暂时性死区」(TDZ),任何读写操作都会触发 ReferenceError。这不是 bug,是设计来强制你写更安全代码的机制。

console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;
  • 声明确实被提升了(否则语法解析就会失败),但引擎拒绝让你在 let b = ... 执行前触碰它
  • TDZ 范围从块开头开始,直到声明语句执行完毕(包括 for (let i...) 循环头部)
  • 常见误判:“let 没有提升”——错。它有提升,只是不初始化,且严格限制访问时机

为什么这个区别在真实项目里要命?

很多线上 bug 来自对提升行为的误判,尤其在条件分支、模块加载顺序、或与 typeof 配合时:

  • var 下的 typeof x 永远不会报错(返回 "undefined"),容易掩盖未定义问题
  • let 下的 typeof x 在 TDZ 内直接报错,反而暴露了依赖顺序问题
  • ES6+ 模块中,顶层 let 声明不会挂载到 window,而 var 会——跨脚本调试时变量“突然消失”往往源于此
  • Vue/React 组件中若用 var 声明响应式数据,可能因提升导致初始化时机错乱;let 则让作用域和生命周期更可控

真正要注意的不是“记住了区别”,而是:只要没显式写 var,就别假设变量能在声明前安全使用——哪怕它看起来“应该存在”。


# vue  # react  # javascript  # es6  # java  # access  # win  # 区别  # 作用域  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何在宝塔面板中修改默认建站目录?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何在阿里云虚拟服务器快速搭建网站?  轻松掌握MySQL函数中的last_insert_id()  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  ,南京靠谱的征婚网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何快速重置建站主机并恢复默认配置?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何快速配置高效服务器建站软件?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  javascript中闭包概念与用法深入理解  Laravel怎么使用Intervention Image库处理图片上传和缩放  利用 Google AI 进行 YouTube 视频 SEO 描述优化  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  node.js报错:Cannot find module 'ejs'的解决办法  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  浅谈Javascript中的Label语句  无锡营销型网站制作公司,无锡网选车牌流程?  如何快速搭建高效WAP手机网站?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Android实现代码画虚线边框背景效果  如何在云主机上快速搭建网站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  jquery插件bootstrapValidator表单验证详解  bing浏览器学术搜索入口_bing学术文献检索地址  WEB开发之注册页面验证码倒计时代码的实现  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何用VPS主机快速搭建个人网站?  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel如何使用withoutEvents方法临时禁用模型事件  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  如何用低价快速搭建高质量网站?  如何用IIS7快速搭建并优化网站站点?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Python面向对象测试方法_mock解析【教程】  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  个人网站制作流程图片大全,个人网站如何注销?