防止命名冲突的关键是让变量“待在该待的地方”:优先用 let/const 替代 var,利用块级作用域隔离;构造函数用表达式定义;模块化或 iife 封装;配合 typescript、eslint 等工具实时检测。

防止命名冲突,关键不是死记作用域规则,而是让变量“待在该待的地方”——作用域控制得越细,冲突就越少。
优先用 let 和 const 声明变量
var 会函数提升、没有块级作用域,容易在 if 或 for 里意外覆盖外层同名变量。let 和 const 天然绑定代码块(如 {}),声明后无法重复定义,同一块内出现两次 let name 会直接报错,从源头拦住错误。
- 循环中要用独立变量时,别写 var i = 0,改用 for (let i = 0; ...)
- if 块里定义的 const message = 'done',外面根本访问不到,不会和别的 message 冲突
- 避免在函数顶部堆一堆 var 变量,把声明挪到真正用到的那一行附近
函数别往全局扔,包进模块或 IIFE
浏览器里直接写 function User() {},它就挂到了 window.User 上;两个脚本都这么写,后者直接覆盖前者。解决方法很简单:
- 现代项目统一用 ES 模块:写 export class User {},其他文件 import { User } from './user.js',天然隔离
- 老项目或单页脚本可用 IIFE:(function() { const User = class {}; /* 其他代码 */ })();,内部所有变量都关在里面,出不去
- 真要暴露接口,只挂一个命名空间对象,比如 window.MyApp = MyApp || {};,再把类塞进 MyApp.User
构造函数别和变量抢名字
写 function User() {} 的同时又写 let User = 'admin',JS 会报错或行为异常。安全做法是:
- 统一用表达式方式定义构造器:const User = class {} 或 const User = function() {}
- 这样 User 就是一个普通常量,遵循和变量一样的命名规则,不会和函数声明机制打架
- 如果必须用 function 声明,就确保整个作用域里不再出现 let/const/var User
借助工具实时发现问题
人会疏忽,但工具不会。开几个基础配置,写错当场提醒:
- VS Code 中启用 TypeScript 类型检查(哪怕没写 .ts 文件),它会标出重复声明、遮蔽变量
- 加 ESLint 插件,启用 no-redeclare(禁止重声明)、no-shadow(禁止遮蔽外层变量)
- 用 Prettier + ESLint 自动格式化+校验,保存即修复常见作用域隐患
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











