箭头函数没有自己的this,而是词法绑定外层普通函数执行时的this值;它不参与this绑定过程,无法通过call/apply/bind修改,且this在定义时即固化。

箭头函数不是“没有 this”,而是它根本不参与 this 绑定过程——它没有自己的执行上下文,也就没有自己的 this。它直接复用定义时所在词法环境里最近一个普通函数的 this 值。
它为什么没有自己的 this
这是 JavaScript 语言设计上的主动选择:箭头函数被定义为词法绑定(lexical binding)的函数形式,不创建独立的执行上下文,因此跳过函数调用时的 this 绑定阶段。普通函数每次调用都会根据调用方式(如 obj.fn()、fn.call(x)、独立调用等)动态计算 this;而箭头函数压根不走这一步。
- 不绑定:没有 [[ThisBindingStatus]] 内部状态
- 不继承:不是从父作用域“继承”this,而是“捕获”那一刻已确定的值
- 不可修改:call/apply/bind 传入的 thisArg 被完全忽略
它是怎么获取外层作用域的 this 的
查找规则非常明确:从箭头函数定义的位置开始,向外逐层查找,直到遇到第一个非箭头函数,取该函数执行时的 this 值。这个值在箭头函数被定义的瞬间就固定下来,后续任何调用方式都不会改变它。
- 写在普通函数内部 → this 等于该普通函数运行时的 this
- 写在类的方法里 → this 等于该方法被调用时的实例(即类方法的 this)
- 写在模块顶层或全局 → this 是全局对象(浏览器中是 window)或 undefined(严格模式)
- 外层全是箭头函数 → 一直找到最外层普通函数;若无,则落到全局 this
一个直观对比
假设有一个对象方法:
const obj = { x: 100 };function outer() {
const regular = function() { console.log(this.x); };
const arrow = () => console.log(this.x);
regular(); // this 是调用者决定的 → 全局或 undefined
arrow(); // this 是 outer 执行时的 this → 输出 100
}
outer.call(obj);
这里 regular 的 this 由调用方式决定,而 arrow 的 this 早在 outer 开始执行、arrow 被创建时就“快照”了 obj —— 它不看自己怎么被调,只看自己在哪被写。











