javascript中class内部所有方法默认运行在严格模式下,这是ecmascript规范强制规定的解析阶段行为,无需显式声明"use strict",且不可退出。

是的,JavaScript 中 class 内部的所有方法(包括构造函数、普通方法、getter/setter、静态方法)默认运行在严格模式下,无需显式写 "use strict"。
为什么 class 方法自动启用严格模式
这是 ECMAScript 规范明确规定的:类体(class body)整体被视为严格模式代码。只要语法上是 class 声明或表达式,其内部所有可执行代码(包括 constructor 和各类方法)都自动启用严格模式语义,与是否写了 "use strict" 无关。
- 这属于语言层面的强制行为,不是运行时检测或自动插入,而是解析阶段就确定的代码上下文
- 即使你在类外部处于非严格模式,只要进入 class 内部方法,就立即切换到严格模式环境
- 箭头函数在 class 中定义时,会继承外层(即 class 方法)的严格模式上下文,因此也受严格模式约束
严格模式在 class 中的实际影响
这些限制对 class 编程很关键,能提前暴露常见错误:
-
禁止静默失败的赋值:比如给不可写属性赋值(如
this.name = "x"在只读 accessor 上)会直接抛TypeError,而非忽略 -
禁止使用
with和arguments.callee:它们在 class 方法中语法报错,避免歧义和性能问题 -
this不再自动绑定为全局对象:普通函数调用时this是undefined(而不是window),防止意外污染全局 -
重复参数名报错:
method(a, a) { }在 class 中直接语法错误,提升可维护性
注意:class 外部代码不受影响
严格模式只作用于 class 内部。你可以在非严格模式脚本中定义 class,class 自身仍保持严格语义;反过来,class 内部也不能“退出”严格模式——就算你写 "use non-strict"(语法非法)或尝试关闭它,也无效。
- 类声明本身不改变外层作用域的模式,外层仍是原来的模式
- 子类继承父类时,子类方法同样自动严格,与父类是否显式声明无关
- 动态生成的 class(如通过
eval或模板字符串拼接)也遵守该规则,只要符合 class 语法
不需要也不建议手动加 "use strict"
在 class 内部写 "use strict" 不报错,但完全多余,且可能误导阅读者以为这是可选行为。规范已固化这一设计,目的是让面向对象代码更安全、一致、可预测。
- 工具链(如 Babel、TypeScript)生成的 class 代码也遵循该规则
- 浏览器和 Node.js 都已完整支持,无需兼容性考虑
- 若想验证,可在 class 方法中尝试
this = 1或with({}){},会立即抛出严格模式相关错误
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











