严格模式是JavaScript的限制性子集,通过"use strict"启用,防止隐式全局变量、静默失败操作、过时语法,并使this更可预测,提升代码可靠性与可维护性。

JavaScript 严格模式(Strict Mode)不是新语言,而是对 JavaScript 执行环境的一种限制性“子集”。它通过在代码顶部添加 "use strict"; 激活,让引擎以更严格、更规范的方式解析和运行代码。它不解决“功能缺失”,而是解决“行为不可靠、容易出错、难以调试”的老问题。
防止意外创建全局变量
非严格模式下,给未声明的变量赋值,JS 会自动把它挂到全局对象(如 window)上,这极易引发命名冲突和内存泄漏。
严格模式下,这种写法直接报错:ReferenceError,强制开发者显式用 let、const 或 var 声明变量。
- 非严格:
counter = 10;→ 静默创建window.counter - 严格:
counter = 10;→ 报错,必须写let counter = 10;
禁止静默失败的操作
很多不合理操作在非严格模式中“假装成功”,掩盖逻辑错误。严格模式让它们显式抛错,便于定位问题。
立即学习“Java免费学习笔记(深入)”;
- 给只读属性赋值(如
Object.defineProperty(obj, 'x', { writable: false }))→ 严格模式下抛TypeError,而非忽略 - 删除不可配置属性(
delete obj.prop)→ 严格模式下报错 - 八进制字面量(
010)→ 严格模式下语法错误,避免混淆(应写0o10)
限制易混淆或过时的语法
一些设计粗糙或已被淘汰的特性,在严格模式中被禁用,推动代码更清晰、更现代。
-
with语句被完全禁止(它破坏作用域链,影响性能且难以优化) - 函数参数名不能重复:
function f(a, a) { }→ 严格模式下语法错误 -
arguments.callee和arguments.caller不可用(阻碍引擎优化,且有替代方案)
让 this 更可预测
非严格模式中,顶层函数或事件回调里的 this 默认指向全局对象(window),常导致意料之外的行为。
严格模式下,这些场景中 this 保持为 undefined,避免隐式绑定带来的 bug。
- 非严格:
function foo() { console.log(this); }→ 输出window - 严格:
function foo() { "use strict"; console.log(this); }→ 输出undefined - 箭头函数不受此影响(它本就不绑定
this),但普通函数调用更可靠了
严格模式不是万能补丁,但它像一层“语法与行为过滤网”,把模糊、危险、过时的惯用法挡在外面,让错误更早暴露、逻辑更易理解、代码更易维护。现代开发中,建议默认启用——无论是单个函数内启用,还是整个脚本顶部启用。










