为何高阶函数中传入的匿名函数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的逻辑
传递给foo.m的匿名函数,执行上下文处于全局作用域(非严格模式)。当以普通函数形式调用f()时,非严格模式会自动将this绑定到全局对象(浏览器环境中就是Window)。代码示例2的逻辑
Boo类的m2方法属于类内部方法,默认处于严格模式。当在m2内部调用foo.m并执行传入的匿名函数时,该函数的执行上下文继承了m2的严格模式环境。在严格模式下,普通函数调用(无明确调用者,非obj.fn()形式)的this会保持为undefined,不会自动绑定到全局对象。
关键总结
- 非严格模式下,普通函数调用的
this指向全局对象 - 严格模式下,普通函数调用的
this为undefined - 类内部方法默认启用严格模式,这就是两段代码
this指向不同的根本原因
内容的提问来源于stack exchange,提问作者unrest7972
相关产品推荐
相关产品推荐

