前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库严格模式静默错误转异常示例
JavaScript模块与语言机制

哪些操作在非严格模式下悄悄失败,严格模式下却会报错?

非严格模式下,给只读属性赋值、删除不可配置属性这些操作会静默失败——不报错,但也没生效。严格模式把这类静默失败变成抛 TypeError,让你第一时间发现代码有问题。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#模块与语言机制
先看核心答案读代码示例
理解线索

严格模式把哪几类静默错误变成异常

  1. 只读属性赋值Object.freeze 或 writable: false 的属性,赋值从无效变成抛错
  2. 不可配置属性删除configurable: false 的属性,delete 从无效变成抛错
  3. 语法层面重名参数、八进制字面量、未声明变量赋值直接报错

ES 模块默认就是严格模式,不需要手动写 "use strict"。现在的项目大多是模块,所以这些规则基本是默认行为。

核心回答

先记住这个答案

非严格模式下有些操作「静默失败」——执行了但不报错也不生效。比如给 Object.freeze 冻结的对象加属性,赋值语句正常走完,但属性根本没加上。严格模式把这类静默失败升级为抛异常,让错误第一时间暴露出来,而不是藏在运行结果里等你慢慢排查。

  • 给只读属性赋值会抛 TypeError
  • delete 不可配置属性同理,严格模式报错
  • 函数参数重名在严格模式下是语法错误
  • 未声明变量赋值在严格模式抛 ReferenceError

最典型的场景:给只读属性赋值

只读属性赋值是面试里问得最多的例子。Object.defineProperty 设了 writable: false、Object.freeze 冻结的对象、只有 getter 没有 setter 的访问器属性,赋值时都会触发这个区别。

非严格模式静默失败 vs 严格模式抛错JavaScript
'use strict'
var obj = {}
Object.defineProperty(obj, 'x', { value: 1, writable: false })
try {
  obj.x = 2 // 严格模式下抛 TypeError
} catch (e) {
  console.log(e.constructor.name)
  console.log(obj.x) // 赋值没生效,还是 1
}
查看输出与解释
TypeError
1

非严格模式下同样的 obj.x = 2 不会报错,但 obj.x 还是 1。这种「不报错也不生效」是最容易埋坑的情况——你以为改了,其实没改,直到上线才发现数据不对。

删除不可配置属性和未声明变量

delete 一个 configurable: false 的属性,非严格模式下返回 false 就完了,严格模式直接抛 TypeError。比如 delete Object.prototype 就会触发这个错误,因为内置对象的属性大多是不可配置的。

另一个高频场景是给未声明的变量赋值。非严格模式下写 x = 1,如果没有用 var、let 或 const 声明,会在全局对象上偷偷创建一个属性。严格模式下这行直接抛 ReferenceError,逼你把声明补上。

未声明变量赋值JavaScript
'use strict'
try {
  undeclaredVar = 42 // 严格模式下抛 ReferenceError
} catch (e) {
  console.log(e.constructor.name)
}
查看输出与解释
ReferenceError

这条规则最大的好处是帮你发现拼错变量名的 bug。非严格模式下 nubmer = 1(拼错了 number)不会报错,会偷偷创建一个全局变量 nubmer,排查起来很痛苦。

语法层面的限制

还有几条规则在语法分析阶段就报错,代码根本执行不到。

函数参数重名在非严格模式下合法,后面的会覆盖前面的。比如 function f(a, a) {} 在非严格模式是允许的,严格模式下直接 SyntaxError。

八进制字面量 0123 在非严格模式下等于 83(八进制的 123),严格模式下也报 SyntaxError,要写八进制得用 0o123。with 语句在严格模式下同样被禁止,因为它让作用域变得不可预测,引擎没法做优化。

这些语法限制的目的都一样:消除含糊的写法,让引擎能做更好的优化,也让代码的行为更可预测。

回答前,多想一步

容易答错的地方

把所有严格模式变化都说成「静默变报错」
严格模式的改变不只是把静默错误变成异常。this 在普通函数调用时变成 undefined、arguments 和形参不再同步、禁止 with 语句,这些是语义层面的变化,不属于「静默错误转异常」。面试时把这两类分开说,条理更清楚。
以为严格模式需要手动开启
ES 模块和 class 内部默认就是严格模式。现在的项目基本都用打包工具把文件编译成模块,所以严格模式是默认行为。只有在老项目的普通 <script> 标签里才需要手动加 "use strict"。
试着用自己的话回答

面试官还会怎么问?

Object.freeze 和 Object.seal 在严格模式下有什么区别?

Object.freeze 冻结后不能增、删、改任何属性;Object.seal 密封后不能增、删属性,但已有的可写属性仍然可以改值。严格模式下违反这些约束都会抛 TypeError,区别在于约束范围不同。

严格模式下 arguments 和参数还是同步的吗?

不是。非严格模式下修改 arguments[0] 会同步改变对应的形参,严格模式下两者各自独立。这也是消除意外行为的设计,让函数参数的值更可预测。

在非严格函数里调用严格函数,会怎样?

严格模式按函数为单位生效。外层非严格的函数里调用一个 "use strict" 函数,或者调用 class 方法、ES 模块里的函数,被调用的函数内部按严格模式执行,外层不受影响。两种模式可以在同一个程序里共存。

从一道题,走向一组知识

把知识连起来

模块与语言机制

严格模式下普通函数里的 this 为什么是 undefined?

严格模式除了让静默错误变报错,还把普通函数调用时的 this 变成 undefined,两个变化经常一起考。

模块与语言机制

ES 模块顶层的 this 是什么?为什么和普通脚本不一样?

ES 模块顶层 this 为 undefined,和严格模式的 this 规则属于同一套设计。

参考资料

  • JavaScript:模块与语言机制参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 最典型的场景:给只读属性赋值
  3. 删除不可配置属性和未声明变量
  4. 语法层面的限制
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑