应优先使用 let/const 声明变量,禁用 var;配合 eslint、typescript 等工具实时检查重复声明与作用域冲突,并通过语义化命名、集中管理常量、就近声明等实践从源头规避问题。

直接用 let 或 const 声明,禁用 var,再配合工具检查,基本就能拦住绝大多数重复声明问题。关键不是靠人记规则,而是让错误在写代码时就亮出来。
用对声明方式,从语言层堵死漏洞
JavaScript 中不同声明方式行为差异很大:
-
let/const:块级作用域,同一作用域内重复声明直接报
SyntaxError: Identifier 'x' has already been declared,编译阶段就失败 -
var:函数作用域,允许重复声明(后续声明被忽略),但容易掩盖逻辑错误,比如
var i = 0; var i = 5;看似无害,实则削弱可读性和可维护性 - 解构赋值也受约束:
const { id } = obj;和const { id } = otherObj;在同一块内等价于重复声明,同样会报错
开好静态检查,让工具替你盯梢
光靠语言特性还不够,得让开发环境实时反馈:
- 启用 ESLint 规则:
no-redeclare(禁止同一作用域重复声明)、no-shadow(禁止内层变量遮蔽外层同名变量) - TypeScript 下更严格:函数参数与内部
let变量同名(如function fn(x) { let x = 2; })会直接报错,不给模糊地带留余地 - VS Code 或 WebStorm 开启语义检查,未使用变量、重复标识符、作用域冲突都会实时高亮
管住命名和作用域,从源头减少冲突可能
命名不是小事,它是第一道防线:
- 状态类变量加语义前缀:
isLoading、isMounted、tempResult,比单纯叫loading或data更不容易撞车 - 全局常量统一放在
constants.ts或config.js中导出,其他文件只import,不自行定义同名常量 - 变量声明尽量靠近首次使用位置,避免堆在函数开头;大函数考虑拆成小函数,每个函数拥有独立作用域
别信“大括号能隔离”,Java 都不行,JS 更不能绕
有人以为用花括号包一下就能重用变量名,比如:
{ let x = 1; }
{ let x = 2; }
这确实合法——因为是两个独立块级作用域。但如果是:
let x = 1; let x = 2; // ❌ 直接报错
或在同一个块里:
{
let x = 1;
let x = 2; // ❌ 同样报错
}
记住:块级作用域不是“免死金牌”,它只是让作用域更细,而不是允许你在同一作用域里反复声明。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











