局部变量应就近声明、按需作用域隔离,以降低代码审查认知负荷、防范并发风险;需通过命名规范、生命周期检查、eslint规则等手段固化实践。

局部变量作用域的精准划分,不是为了“写得更细”,而是为了让代码审查时一眼看清:谁在用、何时用、用完即弃。它直接减少评审者理解上下文的成本,降低误判率,提升可维护性评分——尤其在高并发项目中,变量生命周期混乱常引发竞态、内存泄漏或状态污染,这些正是CR重点拦截的风险点。
让每个变量只活在它真正需要的那几行里
高并发逻辑常含多阶段处理(如请求解析→校验→缓存检查→DB操作→响应组装),若把所有中间变量堆在函数开头声明,评审者需全程“脑内跟踪”每个变量是否被重用、是否跨阶段残留。精准划分意味着:
- 循环变量、临时计算结果、单次使用的API响应体,全部在首次使用前就近声明,不提前“占位”
- 不同处理阶段用显式花括号块隔离(即使无if/for),例如:
{ const cacheKey = genKey(req); const cached = cache.get(cacheKey); if (cached) return cached; } - 避免“一个函数+一个大const对象”模式,把配置项、映射表等拆到独立常量或模块,不塞进业务函数作用域
用IIFE或模块封装替代全局挂载,消除隐式依赖线索
大型项目常有多个团队并行开发,若共用window.APP或global.config传递状态,CR时很难确认某处读取的APP.auth.token是否已被其他模块意外覆盖。改用轻量隔离:
- 对老系统补丁或第三方脚本嵌入,直接套IIFE:
(function(authService, logger) { /* 只在此处用 authService.getToken() */ })(Auth, Logger); - 新模块默认导出函数而非对象,强制调用方显式传入依赖,如
createOrderService({ db, cache, metrics }) - 禁止在模块顶层写
let currentUser,改用参数注入或闭包缓存:const makeHandler = (user) => () => { /* user只在此闭包内有效 */ };
在CR清单中加入“作用域健康度”硬性检查项
把变量作用域管理纳入标准化评审流程,让可维护性可衡量:
-
命名即作用域提示:拒绝
dataresulttemp类泛化名;要求体现范围,如cacheHitResponsedbFallbackPayload -
生命周期匹配检查:若变量在
try块内声明,却在finally或后续catch中被引用,必须说明理由 -
并发安全标注:对确实需跨异步步骤共享的变量(如请求ID),要求加
// @shared-across-async: traceId, immutable after init注释,并验证是否只读
配合ESLint规则固化习惯,不让人为疏漏绕过CR
人工评审会疲劳,但工具不会。在团队CI中启用以下规则,使作用域规范成为提交门槛:
-
no-var+prefer-const:杜绝var导致的变量提升干扰 -
no-shadow:禁止子作用域重名覆盖父作用域变量,避免混淆 -
max-statements-per-line设为1:强制每行只做一件事,自然推动变量就近声明 - 自定义规则检测
let声明后超过15行未使用:提示可能作用域过大











