严格模式下无法禁用不规范变量声明,而是直接抛出referenceerror或syntaxerror;必须在脚本顶部或函数开头显式添加"use strict";,且不可被隔开。

严格模式下无法“禁用”不规范的变量声明,而是自动禁止这类写法——只要启用严格模式,未声明就赋值、使用保留字作变量名、重复声明参数等行为会直接抛出 ReferenceError 或 SyntaxError,而不是静默失败。
确保严格模式生效
必须在脚本顶部或函数体开头显式添加 "use strict";(字符串字面量),且不能被注释、空行或其它语句隔开:
- ✅ 正确(全局严格模式):
"use strict";<br>let x = 10;<br>undeclared = 20; // 报错:ReferenceError
- ✅ 正确(函数级严格模式):
function foo() {<br> "use strict";<br> var a = 1;<br> b = 2; // 报错:ReferenceError - ❌ 无效(位置错误或被干扰):
console.log("start");<br>"use strict"; // 不起作用(非首行)
严格模式拦截的典型不规范声明
以下写法在严格模式中会立即报错,无需额外配置:
-
隐式全局变量:省略
var/let/const直接赋值 →ReferenceError -
重复声明变量:同一作用域内多次用
let或const声明同名变量 →SyntaxError -
使用保留字作标识符:如
let interface = 1;(interface是保留字)→SyntaxError -
函数参数重名:如
function f(a, a) { }→SyntaxError
与非严格模式的关键区别
非严格模式下这些操作可能静默成功或产生意外行为:
-
foo = 123;→ 创建全局变量window.foo(浏览器环境) -
function g(x, x) { return x; }→ 不报错,第二个参数覆盖第一个 -
var eval = 42;→ 允许(但危险),严格模式下直接报错
现代开发建议
不必手动“禁用”,应主动启用并依赖严格模式的约束:
- 模块(
.mjs文件或import/export)默认启用严格模式 - ES6+ 中优先使用
let和const,它们天然具备块级作用域和重复声明检查 - 配合 ESLint 规则(如
no-implicit-globals、no-dupe-args)提前发现潜在问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











