当前位置: 首页 > news >正文

块级作用域的应用场景有哪些?

这是 JS 基础最核心、面试必问的知识点我用最简单、最清晰的方式给你总结只记关键区别就行。一句话总结var旧语法无块级作用域、可重复声明、会变量提升尽量别用let新语法有块级作用域、不可重复声明、存在暂时性死区用于变量const新语法和 let 规则一致但必须初始化、不能重新赋值用于常量1. 作用域最核心区别var函数级作用域没有块级作用域{}限制不住它let / const块级作用域if / for / while {}里声明外面访问不到js// var 不受 {} 限制 if (true) { var a 10; } console.log(a); // 10 ✅ 能访问 // let/const 受 {} 限制 if (true) { let b 20; } console.log(b); // ❌ 报错b is not defined2. 重复声明var可以重复声明后面覆盖前面let / const同一作用域内不能重复声明直接报错jsvar x 1; var x 2; // ✅ 不报错 let y 1; let y 2; // ❌ 报错重复声明3. 变量提升 暂时性死区var会变量提升可以先使用后声明值为undefinedlet / const也会提升但不能在声明前使用暂时性死区 TDZjsconsole.log(num); // undefined ✅var 提升 var num 10; console.log(name); // ❌ 报错let 存在暂时性死区 let name zs;4. 赋值与修改const 特殊var / let可以先声明后赋值也可以随时修改值const必须声明时初始化不能只声明不赋值基本类型不能改值引用类型可以改内部属性js// 错误示范 const age; // ❌ 必须赋值 // 正确示范 const PI 3.14; PI 3.1415; // ❌ 基本类型不能改 // 引用类型对象/数组可以改内部不能改指向 const user { name: zs }; user.name ls; // ✅ 可以改 user {}; // ❌ 不能重新赋值5. 全局声明挂载 windowvar在全局声明会挂载到 window 对象let / const不会挂载到 windowjsvar a 10; console.log(window.a); // 10 ✅ let b 20; console.log(window.b); // undefined ❌终极记忆表表格特性varletconst作用域函数级块级块级重复声明允许不允许不允许变量提升有 (undefined)有 (TDZ 禁止访问)有 (TDZ 禁止访问)重新赋值允许允许不允许必须初始化不需要不需要必须全局挂载 window是否否最佳实践工作中直接照做默认用 const大部分值不需要改更安全需要变的用 let循环、计数器、变量彻底放弃 varES6 之后无任何使用场景总结var旧、无块级作用域、不安全let变量专用块级作用域可修改const常量专用块级作用域必须初始化、不能重新赋值我可以给你出 3 道经典面试题帮你彻底巩固这个知识点需要吗块级作用域的应用场景有哪些块级作用域let/const实用应用场景块级作用域{ }内独立作用域外部访问不到内部变量1. for 循环经典场景最常用解决var循环变量泄露、定时器取值错乱问题js// 错误 var全取最后值 for(var i0;i3;i){ setTimeout(()console.log(i)) // 全输出3 } // 正确 let每次循环生成独立块级作用域 for(let i0;i3;i){ setTimeout(()console.log(i)) // 0 1 2 }2. 分支语句隔离变量if /else/switchif 内部变量不会跑到全局避免变量污染jsif(true){ let msg 成功; } console.log(msg) // 报错外部访问不到3. 临时代码块隔离变量单独{}划分临时作用域用完即销毁js{ let temp 123; console.log(temp); } // temp 不存在不污染外层变量4. 防止变量命名冲突同一页面 / 函数内同名变量互不干扰js// 第一段逻辑 { let num 10; } // 第二段逻辑 { let num 20; // 互不冲突 }5. 函数内部局部临时变量函数里拆分逻辑块各自私有变量jsfunction fn(){ // 逻辑1 {let a1} // 逻辑2 {let a2} }6. 循环嵌套互不干扰多层 for 循环变量不串值jsfor(let i0;i2;i){ for(let j0;j2;j){ // i、j 各自独立 } }7. 避免全局变量泛滥不用闭包也能私有化变量替代旧时代 IIFE 立即执行函数js// 旧写法IIFE 模拟块级 (function(){var a1})() // 新写法 直接{} let/const {let a1}8. 解构赋值、临时常量隔离接口数据临时解析用完销毁js{ const {name,age} res.data; // 仅块内使用 }核心好处杜绝变量污染循环取值正常同名变量不冲突代码逻辑分区清晰淘汰 var代码更严谨一句话使用原则只要变量只想在{}里用就用 let/const 开启块级作用域
http://www.zskr.cn/news/1335040.html

相关文章:

  • 【大模型12步学习路线 · 第10步 · ①原理篇】LLM 微调全景:Full FT / LoRA / QLoRA / DoRA / DPO,从 PEFT 到偏好对齐
  • 35小时智能体自主进化!千问旗舰模型Qwen3.7-Max重磅发布
  • VCSA 8.0部署卡在初始化VCS服务、认证失败?NTP+DNS一招解决
  • Vibe Coding 灾难的爆发
  • 如何判断杉木桩品牌的选型标准?
  • 嵌入式PID温度控制:从算法原理到C语言工程实现
  • 2026青岛楼宇自控厂家/能耗监测系统厂家品牌测评 不同维度优选实力商家!最佳选型指南!
  • 高人气网页游戏排行榜单,适合长期玩的网页游戏精选
  • AI从业者的理财攻略:如何用AI技术实现被动收入
  • 基于RK3568的OpenHarmony开发板:从硬件选型到系统定制的全流程实践
  • 谷歌开发者大会2026:Gemini全面升级,重塑搜索与生活体验!
  • 保姆级教程:用G2O搞定视觉SLAM中的BA优化(附ORB-SLAM实战代码片段)
  • 嵌入式开发必备:Linux下ELF文件查看与交叉编译验证全攻略
  • 16位微控制器:电池供电与物联网节点的性能功耗平衡之道
  • CAN总线接口电路设计实战:从差分信号原理到PCB布局避坑指南
  • RTKLIB PPP中的扩展卡尔曼滤波(EKF)到底怎么跑的?filter函数逐行解析
  • 从入门到发表:用Perplexity完成一篇ApJ Letters级文献综述——12个被顶刊审稿人反复验证的搜索链路
  • 别再让用户错过消息!UniApp应用通知权限引导的最佳实践与UniPush 2.0优化
  • 从编译到部署:手把手教你为你的C++项目正确链接Boost库(附CMakeLists.txt示例)
  • 告别Navicat!用VSCode的Database Client插件搞定MySQL、Redis连接与可视化操作
  • S32K3 FlexCAN驱动避坑指南:从波特率计算到邮箱锁定的实战心得
  • Perplexity历史搜索结果漂移之谜(2022→2024训练数据衰减实测报告):如何锁定可信时间切片并锚定原始出处
  • 什么是组合模式?一文详解
  • 【限时解密】Perplexity文化新闻搜索的“暗层过滤器”:3个未文档化content-type策略如何悄悄屏蔽非西方叙事?
  • 避坑指南:Lidar AI Solution环境配置中libprotobuf版本冲突与Python推理Segmentation fault解决实录
  • 说说Java HashMap的工作原理
  • 为服务器安全保驾护航的“三道防线”!
  • BGM自由!2026视频创作者必备的5个免费商用音乐素材库
  • 别再手动跑仿真了!用Simulink Test Manager搞定模型单元测试(附Excel数据对比)
  • 2026 AI面试软件Top5测评:鹅来面,你的全链路求职制胜法宝