应使用 let/const 在块级作用域内声明敏感变量,避免 var 的变量提升和函数作用域问题;优先 const,配合裸花括号或 IIFE 限制作用域,防止异步闭包导致的数据泄露。

用 let 或 const 在块级作用域(如 {}、if、for、try 等内部)声明变量,能有效限制变量生命周期和访问范围,防止意外泄露或篡改。
用 let/const 替代 var
var 声明的变量存在变量提升和函数作用域,容易在块外被访问或覆盖;而 let 和 const 具有块级作用域,且不会被提升。
- 敏感临时值(如解密密钥、token 片段、中间计算结果)应只在真正需要的代码块内声明
- 优先用
const,除非变量必须重新赋值;避免无意修改 - 示例:处理临时 token 时,不把它挂到函数顶层或全局
主动创建最小作用域块
即使没有控制流语句,也可用裸花括号 {} 构建独立作用域,把敏感操作“包起来”。
- 写法:
{ const tempKey = deriveKey(); use(tempKey); } - 该
tempKey在块外不可访问,也无法被后续代码误读或污染 - 适合一次性解密、签名、哈希等场景,尤其在回调或异步链中防变量逃逸
配合立即执行函数表达式(IIFE)增强隔离(旧环境兼容)
在不支持 let/const 的老旧运行时(如某些嵌入式 JS 引擎),可用 IIFE 模拟块级作用域:
立即学习“Java免费学习笔记(深入)”;
(function() { const secret = window.atob('xxx'); doSomething(secret); })();- 函数调用后作用域销毁,变量无法从外部访问
- 现代代码中非必需,但对需兼容 IE11 或特定 Node.js 早期版本时仍有价值
注意异步上下文中的作用域陷阱
在 setTimeout、Promise、事件回调中,闭包可能意外捕获外层变量,导致敏感数据长期驻留内存。
- 避免在异步回调中直接引用外层
let/const变量,尤其是大对象或凭证 - 必要时,在异步前用局部常量提取并明确传参,而非依赖闭包捕获
- 例如:
{ const token = getTempToken(); fetch('/api', { headers: { auth: token } }); }比在循环里直接用i或item更安全


















