严格模式下this指向undefined是为了暴露隐式绑定问题,倒逼显式控制上下文,从而防止污染全局对象、避免构造函数误调静默失败、消除模块环境歧义、明确箭头函数继承语义。

严格模式下 this 指向 undefined,不是为了“让代码报错”,而是通过暴露隐式绑定问题,倒逼开发者显式控制上下文,从而规避意外污染全局对象、掩盖调用错误、或在模块化环境中产生不可预测行为。这种设计带来的安全性提升,关键在于“提前拦截风险”,而非运行时兜底。
防止意外修改全局对象
非严格模式下,顶层函数中直接写 this.name = 'xxx',实际等价于 window.name = 'xxx'(浏览器)或 global.name = 'xxx'(Node.js)。这可能覆盖原生属性(如 window.location 被误赋值)、干扰其他库逻辑,甚至引入 XSS 风险(例如把用户输入拼进 this.innerHTML)。严格模式让这类赋值直接抛出 TypeError,强制你明确使用 window 或 globalThis —— 也就是“写清楚才允许改”。
避免构造函数误调导致的静默失败
定义了构造函数 function User(name) { this.name = name; },若忘记加 new 直接调用 User('Alice'):
- 非严格模式:this 指向 window,结果是 window.name = 'Alice',对象没创建,错误被掩盖;
- 严格模式:this 是 undefined,执行 this.name = ... 立即报错 Cannot set property 'name' of undefined。
这个报错能立刻定位到调用缺失 new,而不是等到后续访问 user.name 时返回 undefined 才排查。
模块环境下消除全局 this 的歧义
ES6 模块默认启用严格模式,顶层 this 就是 undefined。这意味着:
- 不会意外依赖 this === window 做环境判断;
- 避免跨平台代码(浏览器/Node.js/Worker)因全局对象名称不同(window / global / self)而行为不一致;
- 构建工具(Vite/Webpack)按模块处理时,所有文件天然具备统一、可预测的 this 行为,减少因打包方式切换引发的隐蔽 bug。
暴露箭头函数与普通函数的语义差异
箭头函数不绑定 this,它继承外层作用域的 this。如果外层是严格模式下的普通函数,其 this 是 undefined,那么箭头函数里的 this 也是 undefined —— 这个结果是确定的、可预期的。而非严格模式下,外层 this 是 window,箭头函数就“偷偷”绑定了全局对象,容易在迁移或重构时造成意料之外的数据读写。严格模式让这种继承关系更透明、更可控。










