javascript严格模式将静默失败操作转为显式报错,如给只读属性赋值、删除不可配置属性、未声明变量赋值等均抛出typeerror或referenceerror;启用方式为在作用域顶部添加"use strict";字符串字面量。

JavaScript 严格模式通过把原本“做了也没用、还不报错”的操作变成明确报错,来禁止静默失败。核心不是靠额外语法去“禁止”,而是启用严格模式后,引擎自动对几类高危行为抛出错误——比如给只读属性赋值、删除不可配置属性、未声明就赋值等。
哪些静默失败操作会被严格模式拦截
非严格模式下,这些操作不报错也不生效,容易掩盖逻辑错误;启用严格模式后,全部转为 TypeError 或 ReferenceError:
- 给只读内置属性赋值(如
NaN = 1、undefined = 2、Infinity = 0)→ 报TypeError - 给不可写对象属性赋值(例如用
Object.defineProperty设置writable: false后再修改)→ 报TypeError - 删除不可配置属性(如
delete Object.prototype)→ 报TypeError - 给不可扩展对象添加新属性(
Object.preventExtensions(obj)后再obj.newProp = 1)→ 报TypeError - 在函数中重复定义参数名(
function fn(a, a) { })→ 报SyntaxError(解析阶段就卡住)
怎么启用严格模式让这些规则生效
只需在作用域顶部加一行字符串字面量 "use strict";,注意它必须是该作用域的**第一条可执行语句**(注释和空行可以前置,但不能有其他代码):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
脚本级启用:放在 .js 文件最开头,整个文件都受控
"use strict";<br>var x = 1;<br>y = 2; // ReferenceError: y is not defined
-
函数级启用:只影响该函数及其内部函数
function safeFn() {<br> "use strict";<br> undeclared = "oops"; // ReferenceError<br>} -
ES6 模块和类自动启用:所有
import/export文件、class声明默认就是严格模式,无需手动加
为什么这能帮你早点发现问题
静默失败最大的问题是:你写了错代码,但程序照常跑、结果不对,还查不出原因。严格模式把“无效操作”变成“立刻中断”,相当于给代码加了一层实时校验:
- 拼错变量名?
userName = "Tom"写成useName = "Tom"→ 直接ReferenceError,而不是悄悄创建全局变量 - 误改冻结对象?
const user = Object.freeze({ name: "Li" }); user.name = "Wang"→ 立刻TypeError,而非赋值失败却无提示 - 删了不该删的属性?
delete Array.prototype.push→ 严格模式下报错,避免污染原生原型
实际使用时要注意什么
严格模式不是万能开关,它不改变 JavaScript 的基本语义,只是收紧容错边界:
- 旧项目逐步迁移时,建议先用函数级启用,避免整页报错
-
"use strict"必须是字符串字面量,不能是变量、表达式或模板字符串 - 不要混用:一个函数里前几行没加,后面再加无效;也不能在
if分支里动态加 - 某些老浏览器(如 IE9 以下)不支持,但现代开发环境基本无需考虑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










