严格模式下独立调用函数时this为undefined;即fn()形式调用,不作为方法、不显式绑定、不通过new调用,此时this不再指向全局对象,而是undefined,但new调用和对象方法调用不受影响。

在严格模式下,独立调用的函数中 this 不再默认绑定到全局对象(如 window 或 globalThis),而是保持为 undefined。这是严格模式的关键行为之一,也是处理“独立 this 绑定”的起点。
理解什么是“独立调用”
所谓独立调用,是指函数不作为对象方法、不通过 call/apply/bind 显式绑定、也不在类/箭头函数等上下文中执行,而是直接以 fn() 形式调用:
-
function foo() { console.log(this); } foo();→ 严格模式下输出undefined -
const obj = { method: foo }; obj.method();→ 此时this是obj,不属于“独立”调用
避免 undefined this 导致运行错误
当函数内部访问 this.x 或调用 this.method() 时,this 为 undefined 会直接抛出 TypeError。常见应对方式有:
- 显式绑定:用
fn.call(obj)、fn.apply(obj, [...])或const bound = fn.bind(obj) - 使用箭头函数(但注意:箭头函数没有自己的
this,它继承外层词法作用域的this,不能用于需要动态绑定的场景) - 在函数开头做防御性检查:
if (this === undefined) throw new Error('this must be bound');
构造函数与 new 调用不受影响
严格模式下,用 new Foo() 调用构造函数时,this 仍正确指向新创建的实例,不会变成 undefined。这点常被误解——严格模式只改变“普通函数独立调用”的 this,不影响 new、对象方法、显式绑定等合法绑定场景。
模块顶层的 this 始终是 undefined
ES 模块(.mjs 或 type="module" 的脚本)默认启用严格模式,且顶层作用域中的 this 始终为 undefined(无论是否写 "use strict")。这不同于 CommonJS 模块(Node.js 中顶层 this === module.exports)。如果需要访问模块上下文,应使用 import.meta 或导出对象,而非依赖 this。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











