严格模式是JavaScript更严格的执行环境,禁用不安全语法;通过"use strict"在脚本顶部或函数首行启用;会报错with语句、重复属性名、隐式全局变量赋值等。

严格模式是什么:它不是新语法,而是更严格的执行环境
严格模式(Strict Mode)是 JavaScript 的一种运行时限制模式,启用后会禁用一些不安全、易出错或已被废弃的语法和行为。它不会改变语言核心,但会让 eval、this、变量声明、重复属性名等行为更明确、更可预测。比如在非严格模式下,给未声明变量赋值会自动创建全局变量;而在严格模式下,这会直接抛出 ReferenceError。
如何启用严格模式:两种方式,作用域不同
严格模式必须通过字面量字符串 "use strict" 启用,且必须出现在脚本或函数体的最顶部(不能有前置语句,哪怕是一行注释也不行)。它有两种启用粒度:
- 全局严格模式:整个脚本生效,放在文件第一行
- 函数级严格模式:只对当前函数及其嵌套函数生效,放在函数体首行
"use strict";
function foo() {
"use strict"; // 这里也合法,但通常只写一次
x = 42; // ReferenceError: x is not defined
}
常见踩坑点:看似正常,实则报错
启用后以下操作会立即报错,而普通模式下可能静默失败或产生意外行为:
-
with语句被完全禁止 ——with ({a: 1}) { console.log(a); }直接 SyntaxError - 删除不可配置属性会抛
TypeError——delete Object.prototype.toString - 对象字面量中重复属性名(如
{a: 1, a: 2})在严格模式下是语法错误 -
arguments.callee和arguments.caller不可用,访问即TypeError - 函数参数名重复(
function f(a, a) {})在严格模式下是语法错误
兼容性与实际建议:别盲目加,优先函数级启用
所有现代浏览器都支持严格模式,但 IE10 及以下不支持全局严格模式(仅支持函数级)。更重要的是:不要在已有大型脚本顶部加 "use strict" 就以为万事大吉。因为很多旧代码依赖非严格行为(比如隐式全局、arguments 的特殊映射),强行启用会导致运行时崩溃。
立即学习“Java免费学习笔记(深入)”;
推荐做法:
- 新项目默认在每个模块/文件顶部启用
- 老项目逐步迁移到函数级,从纯逻辑函数开始(如工具函数、校验函数)
- 避免在
eval字符串中单独启用 ——eval('"use strict"; x = 1')会创建独立严格上下文,但污染难控
真正麻烦的不是启用,而是没意识到 arguments 和参数名之间的绑定关系已被切断,或者误以为严格模式能帮你发现所有未声明变量 —— 它只管执行时的赋值,不管 let/const 块级作用域问题。










