严格模式通过改变变量赋值行为阻止隐式创建全局变量,未声明即赋值会立即抛出referenceerror;必须用var/let/const显式声明;禁止重复参数、重复声明及with语句;启用需置于脚本或函数首行。

严格模式本身不“强制禁止作用域”里的未声明变量,而是通过改变变量赋值行为来阻止隐式创建全局变量。关键不是作用域被禁用,而是未声明就赋值这个动作直接报错。
未声明变量在严格模式下会立即报错
非严格模式中,x = 10 这样的写法若 x 没声明,引擎会自动把它挂到全局对象(如 window 或 globalThis)上——这叫隐式全局变量,极易污染环境、引发冲突。严格模式彻底切断这条路:
-
"use strict"; x = 10;→ 立即抛出 ReferenceError: x is not defined - 错误发生在赋值瞬间,不等代码执行到后续逻辑
- 无论该语句出现在全局作用域、函数作用域还是块级作用域内,只要没提前声明,一律报错
必须显式声明才能使用
严格模式要求所有变量在使用前必须用 var、let 或 const 明确声明:
-
let x = 10;✅ 合法,块级作用域 -
const y = "hello";✅ 合法,不可重新赋值 -
var z = true;✅ 合法(虽不推荐,但语法允许) -
x = 10;❌ 报错,不管x是否在上层作用域中存在
函数参数和变量名也不能重复
严格模式还强化了声明层面的约束,进一步避免歧义:
- 函数不能有重复参数名:
function test(a, a) { }→ SyntaxError - 同一作用域内不能用
let/const重复声明同名变量 -
with语句被完全禁用,因为它会动态改变作用域链,导致变量查找不可预测
如何启用并确保生效
启用方式简单,但位置和范围很重要:
-
脚本级启用:在 JS 文件最顶部第一行写
"use strict";,整文件生效 -
函数级启用:在函数体第一行写
"use strict";,仅该函数内生效 - ES6 模块和类自动启用:不用手动加,模块顶层和 class 内部默认就是严格模式
- 注意:不能写在条件语句或表达式里,比如
if (true) {"use strict";}是无效的
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











