严格模式下全局调用函数时this为undefined,是语言设计主动切断默认绑定以防止全局污染;非严格模式因历史原因默认指向window/global,易导致意外修改全局属性。

严格模式下全局调用函数时 this 为 undefined,不是“变出来的”,而是语言设计上主动切断默认绑定、防止误操作的结果。它不改变函数本身,只改变调用时的执行上下文规则。
为什么非严格模式下 this 指向全局对象?
早期 JavaScript 设计时,独立调用函数(如 foo())没有明确归属对象,就默认把 this 指向全局对象(浏览器中是 window)。这看似方便,却容易导致意外污染全局属性,比如:
-
this.name = "test"实际改了window.name -
console.log(this)看起来像在“当前环境”,但其实隐式绑定了全局
严格模式如何让 this 变成 undefined?
只要函数体处于严格模式,且调用方式属于「默认绑定」(即没通过对象、call/apply/bind、构造函数或箭头函数等方式指定 this),那么 this 就是 undefined。触发方式有三种:
- 函数内部第一行写
"use strict"; - 整个脚本顶部加
"use strict"; - 使用 ES6 模块(
.mjs文件或<script type="module"></script>),自动启用严格模式
它只影响默认绑定,不影响其他情况
这个规则非常“精准”,只作用于最基础的调用场景,其余方式不受干扰:
-
obj.method()→this仍指向obj -
fn.call({x:1})或fn.bind(obj)()→this由你指定,不会变成undefined - 箭头函数 → 不绑定
this,直接继承外层作用域,和严格模式无关
实际开发中这个设计有什么用?
把 this 设为 undefined 不是为了增加麻烦,而是提前暴露问题:
- 避免静默修改全局对象,提升代码安全性
- 让
this行为更可预测,减少调试时的猜测成本 - 配合 ESLint 的
no-invalid-this规则,能快速发现未正确绑定this的地方 - 在 TypeScript 中,编译器更容易推断类型,减少
any泛滥
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











