You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何高阶函数中传入的匿名函数this指向分别为Window和undefined?

为什么两段代码中匿名函数的this指向不同?

先看两段代码的完整展示:

代码示例1:this指向Window

class Foo {
  m(f) {
    f();
  }
}
let foo = new Foo();

foo.m(function () {
  console.log(this);
  // 输出:Window
});

代码示例2:this指向undefined

class Foo {
  m(f) {
    f();
  }
}

class Boo {
  m2() {
    let foo = new Foo();

    foo.m(function () {
      console.log(this);
      // 输出:undefined
    });
  }
}
let boo = new Boo();
boo.m2();

核心原因:类的方法默认启用严格模式

JavaScript类有一个关键特性:类内部的所有方法(实例方法、静态方法)默认运行在严格模式下,无需手动声明'use strict'。

  1. 代码示例1的逻辑
    传递给foo.m的匿名函数,执行上下文处于全局作用域(非严格模式)。当以普通函数形式调用f()时,非严格模式会自动将this绑定到全局对象(浏览器环境中就是Window)。

  2. 代码示例2的逻辑
    Boo类的m2方法属于类内部方法,默认处于严格模式。当在m2内部调用foo.m并执行传入的匿名函数时,该函数的执行上下文继承了m2的严格模式环境。在严格模式下,普通函数调用(无明确调用者,非obj.fn()形式)的this会保持为undefined,不会自动绑定到全局对象。

关键总结

  • 非严格模式下,普通函数调用的this指向全局对象
  • 严格模式下,普通函数调用的this为undefined
  • 类内部方法默认启用严格模式,这就是两段代码this指向不同的根本原因

内容的提问来源于stack exchange,提问作者unrest7972

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:42:40