严格模式通过报错拦截未声明赋值,强制显式声明变量;必须用let/const(优先const)初始化声明,禁用var;变量就近声明于使用处,函数参数须唯一且推荐解构默认值。

严格模式能直接堵住变量声明漏洞,核心是让“未声明就赋值”从静默创建全局变量变成立即报错。修复的关键不是加个 "use strict" 就完事,而是配合明确的声明习惯。
必须显式声明,不接受隐式创建
非严格模式下 userName = "Tom" 会悄悄挂到全局对象上,极易污染和误用。严格模式下这行代码直接抛出 ReferenceError。修复方式只有一条:所有变量都得用 let、const 或(不推荐但兼容)var 显式声明。
- ✅ 正确:
const API_URL = "https://api.example.com";、let count = 0; - ❌ 错误:
data = { id: 1 };、tempValue = "hello";
优先用 const,按需改用 let
const 不仅语义清晰,还能避免意外重赋值导致的状态混乱;只有确实需要重新赋值时才用 let。不用 var,因为它仍允许变量提升和重复声明,违背严格模式“明确即安全”的初衷。
- 配置项、DOM 引用、函数定义 → 用
const - 循环计数器、开关标志、中间计算结果 → 用
let - 避免
let x;空声明,尽量声明即初始化,比如let retries = 0;
声明位置紧贴使用处,控制作用域
别把变量全堆在函数开头。块级作用域是严格模式的重要支撑,应在真正需要的地方声明,自然限制其可访问范围。
- 在
if块里用的变量,就在if内部声明 - 循环中用的临时变量,写在
for或while语句里 - 避免函数顶部堆一堆
let a, b, c;,既难维护又易误用
函数参数也受约束,避免歧义
严格模式禁止重复参数名,这是变量声明规范的延伸。它强制你用更清晰的方式表达意图,比如解构 + 默认值。
- ❌ 报错:
function load(url, url, timeout) { } - ✅ 推荐:
function load(url, { timeout = 3000, method = "GET" } = {}) { } - 参数即变量,同样要唯一、显式、有默认兜底


















