箭头函数没有自己的this,而是继承定义时外层最近普通函数的this值;该值在函数创建时固定,不受调用方式或call/apply/bind影响。

箭头函数内部的 this 不指向调用者,也不随调用方式变化——它根本就没有自己的 this,而是直接沿用定义时所在词法作用域中**最近一层普通函数**的 this 值。这个值在函数创建那一刻就“定格”了,后续任何调用、call/apply/bind 都无法改变。
箭头函数 this 的真实来源
判断它的 this 指向,关键不是看怎么调用,而是看“在哪写的”:
- 如果写在某个普通函数(
function声明)内部 →this就等于那个普通函数执行时的this - 如果写在类的方法里(比如
render() { const fn = () => ... })→this就是该方法被调用时的实例(即类实例) - 如果直接写在模块顶层或全局作用域 →
this是全局对象(浏览器中为window,严格模式下为undefined) - 如果外层全是箭头函数 → 继续往外找,直到遇到第一个普通函数或落到全局
常见误判场景与实际表现
这些例子能帮你避开典型陷阱:
-
对象字面量里直接写箭头方法:
const obj = { name: 'A', f: () => console.log(this.name) }→obj.f()中的this不是obj,而是外层作用域的this(通常是window或undefined) -
定时器回调用箭头函数:
setTimeout(() => console.log(this.val), 100)→ 能正确访问实例属性,不是因为“定时器特殊”,而是因为它捕获的是外层函数(比如构造函数或方法)执行时的this -
类字段箭头函数:
handleClick = () => console.log(this.state)→this指向类实例,是因为它在构造函数执行期间被定义,此时this已绑定为新实例
用浏览器开发者工具验证 this 指向
调试时不用猜,可以直接观察:
- 在箭头函数内部加断点,暂停后在控制台输入
this,看输出值是什么 - 右键断点行 → “Add logpoint” → 输入
console.log('arrow this:', this),运行时自动打印 - 对比普通函数:在同一位置写一个
function,也打 log,你会发现两者this值不同 - 尝试对箭头函数调用
.call({x:1})或.bind({y:2}),再在断点里查this—— 它不会变,这就确认了词法绑定
快速自检方法
三步就能确认你写的箭头函数 this 是否如预期:
- 找到箭头函数定义的位置,向上看最近一个
function关键字(不是箭头函数) - 想清楚那个普通函数被调用时
this是什么(比如obj.method()中就是obj) - 那个值,就是箭头函数的
this

















