news 2026/5/21 2:16:53

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
块级作用域的应用场景有哪些?

这是 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 defined

2. 重复声明

  • var:可以重复声明,后面覆盖前面
  • let / const同一作用域内不能重复声明,直接报错

js

var x = 1; var x = 2; // ✅ 不报错 let y = 1; let y = 2; // ❌ 报错:重复声明

3. 变量提升 & 暂时性死区

  • var:会变量提升,可以先使用后声明(值为undefined
  • let / const:也会提升,但不能在声明前使用(暂时性死区 TDZ)

js

console.log(num); // undefined ✅(var 提升) var num = 10; console.log(name); // ❌ 报错(let 存在暂时性死区) let name = "zs";

4. 赋值与修改(const 特殊)

  • var / let:可以先声明后赋值,也可以随时修改值
  • const
    1. 必须声明时初始化(不能只声明不赋值)
    2. 基本类型不能改值引用类型可以改内部属性

js

// 错误示范 const age; // ❌ 必须赋值 // 正确示范 const PI = 3.14; PI = 3.1415; // ❌ 基本类型不能改 // 引用类型(对象/数组):可以改内部,不能改指向 const user = { name: "zs" }; user.name = "ls"; // ✅ 可以改 user = {}; // ❌ 不能重新赋值

5. 全局声明(挂载 window)

  • var:在全局声明,会挂载到 window 对象
  • let / const:不会挂载到 window

js

var a = 10; console.log(window.a); // 10 ✅ let b = 20; console.log(window.b); // undefined ❌

终极记忆表

表格

特性varletconst
作用域函数级块级块级
重复声明允许不允许不允许
变量提升有 (undefined)有 (TDZ 禁止访问)有 (TDZ 禁止访问)
重新赋值允许允许不允许
必须初始化不需要不需要必须
全局挂载 window

最佳实践(工作中直接照做)

  1. 默认用 const(大部分值不需要改,更安全)
  2. 需要变的用 let(循环、计数器、变量)
  3. 彻底放弃 var(ES6 之后无任何使用场景)

总结

  • var:旧、无块级作用域、不安全
  • let:变量专用,块级作用域,可修改
  • const:常量专用,块级作用域,必须初始化、不能重新赋值

我可以给你出 3 道经典面试题,帮你彻底巩固这个知识点,需要吗?

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

块级作用域(let/const)实用应用场景

块级作用域:{ }内独立作用域,外部访问不到内部变量

1. for 循环经典场景(最常用)

解决var循环变量泄露、定时器取值错乱问题

js

// 错误 var:全取最后值 for(var i=0;i<3;i++){ setTimeout(()=>console.log(i)) // 全输出3 } // 正确 let:每次循环生成独立块级作用域 for(let i=0;i<3;i++){ setTimeout(()=>console.log(i)) // 0 1 2 }

2. 分支语句隔离变量(if /else/switch)

if 内部变量不会跑到全局,避免变量污染

js

if(true){ let msg = "成功"; } console.log(msg) // 报错,外部访问不到

3. 临时代码块隔离变量

单独{}划分临时作用域,用完即销毁

js

{ let temp = 123; console.log(temp); } // temp 不存在,不污染外层变量

4. 防止变量命名冲突

同一页面 / 函数内,同名变量互不干扰

js

// 第一段逻辑 { let num = 10; } // 第二段逻辑 { let num = 20; // 互不冲突 }

5. 函数内部局部临时变量

函数里拆分逻辑块,各自私有变量

js

function fn(){ // 逻辑1 {let a=1} // 逻辑2 {let a=2} }

6. 循环嵌套互不干扰

多层 for 循环变量不串值

js

for(let i=0;i<2;i++){ for(let j=0;j<2;j++){ // i、j 各自独立 } }

7. 避免全局变量泛滥

不用闭包也能私有化变量,替代旧时代 IIFE 立即执行函数

js

// 旧写法(IIFE 模拟块级) (function(){var a=1})() // 新写法 直接{} + let/const {let a=1}

8. 解构赋值、临时常量隔离

接口数据临时解析,用完销毁

js

{ const {name,age} = res.data; // 仅块内使用 }

核心好处

  1. 杜绝变量污染
  2. 循环取值正常
  3. 同名变量不冲突
  4. 代码逻辑分区清晰
  5. 淘汰 var,代码更严谨

一句话使用原则

只要变量只想在{}里用,就用 let/const 开启块级作用域

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 2:16:37

保姆级教程:用Python+OpenCV实现无人机吊舱图像与卫星地图的自动匹配(附代码)

PythonOpenCV实战&#xff1a;无人机吊舱图像与卫星地图的高精度自动匹配 当无人机在百米高空掠过目标区域时&#xff0c;吊舱相机捕捉到的倾斜视角图像往往与卫星地图存在显著差异——焦距变化导致的视野缩放、拍摄角度不同引发的透视变形、光照条件差异造成的色彩偏差。如何让…

作者头像 李华
网站建设 2026/5/21 2:14:45

我真正用于波段交易的7个提示词

当我刚开始做波段交易的时候,我以为成功会来自于找到那个"完美的指标"。 我花了无数个小时看YouTube视频,在交易推特上刷屏,从Reddit下载各种随机策略。每个博主都听起来信心满满,每个策略在图表上都看起来稳赚不赔。 但当我真正开始交易的时候,我却一直在做出情绪…

作者头像 李华
网站建设 2026/5/21 2:13:33

2026青岛楼宇自控厂家/能耗监测系统厂家品牌测评 不同维度优选实力商家!最佳选型指南!

在 “双碳” 目标深化落地、青岛智慧城市建设加速推进的背景下&#xff0c;楼宇自控系统已成为商业综合体、产业园区、政务建筑、医院学校等场景实现节能降碳、智能管控的核心支撑。青岛楼宇自控市场形成了国际品牌主导高端、本土品牌崛起领跑、区域集成商补充的格局&#xff0…

作者头像 李华
网站建设 2026/5/21 2:08:46

别再死磕标注数据了!用扩散模型从海量无标签遥感图像中‘白嫖’语义信息,提升变化检测精度

扩散模型在遥感变化检测中的无监督语义挖掘实战 遥感图像变化检测一直是地理信息科学和计算机视觉交叉领域的重要课题。传统方法高度依赖大量精确标注的训练数据&#xff0c;而标注成本高昂、周期漫长&#xff0c;成为制约算法性能提升的瓶颈。2022年涌现的多项突破性研究证明&…

作者头像 李华
网站建设 2026/5/21 2:08:42

保姆级教程:用G2O搞定视觉SLAM中的BA优化(附ORB-SLAM实战代码片段)

从零构建视觉SLAM后端优化&#xff1a;G2O在BA中的工程实践与ORB-SLAM代码解析 当我们在视觉SLAM系统中完成前端特征提取与帧间匹配后&#xff0c;真正的挑战才刚刚开始——如何将这些带有噪声的观测数据转化为精确的位姿与地图&#xff1f;这正是Bundle Adjustment&#xff08…

作者头像 李华