核心是用对声明方式,let和const的块级作用域天然实现变量独立绑定而非覆盖;优先使用它们可避免var的提升与作用域问题;同名声明属可控遮蔽,应通过语义化命名(如validateduserid)和eslint/ts规则保障清晰性。

核心是用对声明方式,而不是去“处理覆盖”。let 和 const 的块级作用域天然让同名变量互不干扰,覆盖只是表象,实质是独立绑定。
优先使用 let 或 const 声明
var 会引发函数作用域和变量提升问题,容易造成意料外的行为。let 和 const 在块级作用域(如 if、for、{})内声明时,即使与外层同名,也会创建一个新绑定,不会修改外部变量:
- 外部 let count = 10;内部 let count = 20 → 两个 count 完全无关
- 内部块执行完后,内部 count 自动销毁,外部 count 保持原值
- ESLint 可通过 no-var 规则强制禁用 var
避免形参与局部变量重名
函数参数本身就是一个绑定,再用 let 声明同名变量会直接报错,这是语言层面的安全保护:
- function fn(x) { let x = 10; } → 语法错误:Identifier 'x' has already been declared
- function fn(x) { var x = 10; } → 不报错但行为不可靠,应杜绝
- TypeScript 的 no-shadow 规则能提前发现这类冲突
需要语义关联时加明确后缀
当新变量由外部变量派生而来,又想保留含义联系,就别复用名字,而是用带意图的命名:
- 原始 const userId = 'u123' → 派生后用 const validatedUserId = validate(userId)
- 传入的 config → 处理中改用 mergedConfig 或 normalizedConfig
- 避免 user(参数)、user(let 声明)并存 → 改为 userParam 和 currentUser
理解遮蔽(shadowing)是可控现象
let/const 的同名声明不是 bug,而是设计好的遮蔽机制。它让代码逻辑更局部化,只要注意可读性即可:
- 在 if 块里写 let status = 'success',不影响外层同名 status
- 若真需访问被遮蔽的外部变量,就换名,而不是强行绕过作用域规则
- 过度遮蔽会降低可维护性,建议单个函数内同名变量不超过一次
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











