javascript 中 switch 语句默认不创建块级作用域,因 case 标签仅为执行跳转点,不构成独立作用域;只有显式添加 {} 才能为 let/const 提供块级作用域,避免变量重复声明错误。

在 JavaScript 中,switch 语句本身不创建块级作用域,但用 {} 显式包裹 case 分支可以借助 let 或 const 实现变量隔离。
为什么 switch 默认没有块级作用域
ES6 之前,var 声明会提升并绑定到函数作用域;即使写在 case 里,也等同于声明在 switch 外层。ES6 引入 let/const 后,它们遵循块级作用域规则——但前提是存在真正的“块”,也就是一对花括号 {}。
标准写法中,每个 case 后直接跟语句,没有自带块,所以:
-
let x = 1;写在case 1:下但没加{}→ 报错(重复声明) - 多个
case共享同一作用域 → 变量名冲突
用显式花括号创建独立块
给每个需要定义局部变量的 case 加上 {},就能让 let/const 生效:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
let key = 'b';
switch (key) {
case 'a': {
let msg = 'hello';
console.log(msg); // 'hello'
break;
}
case 'b': {
let msg = 'world'; // ✅ 不冲突,新块
console.log(msg); // 'world'
break;
}
}
console.log(msg); // ReferenceError: msg is not defined
注意:break 要放在块内,否则会穿透执行下一个 case。
避免常见陷阱
-
不要只靠缩进或换行:空花括号
{}必须显式写出,否则无作用域效果 -
慎用 fall-through:若故意省略
break,又用了块,需确认变量是否真要跨 case 共享 -
别混用 var 和 let:同一 switch 中混用会导致意外提升或报错,统一用
let/const -
default 分支也要加块:如果它也需要自己的局部变量,同样得用
{}包裹
替代方案:立即执行函数表达式(IIFE)
旧代码或需兼容极老环境时,可用 IIFE 模拟块作用域(不推荐新项目):
case 'x': (function() {
const temp = 42;
console.log(temp);
})(); break;
但现代 JS 直接用 {} 更简洁、语义更清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










