箭头函数的this在定义时绑定外层第一个普通函数或全局作用域的this,之后不可变,且无法通过call/apply/bind修改;常见于类中避免this丢失,但若外层this本身错误,箭头函数会继承该错误。

箭头函数的 this 不是运行时动态绑定的,它在定义时就“记住”了外层第一个普通函数(或全局作用域)的 this 值,之后永远不变。
外层必须是普通函数或全局作用域
箭头函数自己不创建执行上下文,所以它会沿作用域链向上查找,直到遇到一个有明确 this 绑定的非箭头函数。这个函数的 this 就成为箭头函数的 this。
- 如果箭头函数写在某个对象方法内部(该方法是普通函数),它的 this 就和那个方法调用时的 this 一致
- 如果箭头函数直接写在全局作用域(不在任何函数内),它的 this 就是全局对象(浏览器中为 window)
- 如果外层只有箭头函数,它会继续往外找,直到找到普通函数或到达全局
不能被 call/apply/bind 改变
因为箭头函数没有自己的 this 绑定机制,call、apply、bind 对它完全无效。
- t.tick.call(obj) 可以强制让普通方法 this 指向 obj
- t.autoTick.call(obj) 不起作用,autoTick 的 this 仍是定义时所属的实例 t
常见典型场景:类中避免 this 丢失
在 class 中,把事件回调或定时器回调写成箭头函数,能天然保留实例上下文:
- 普通方法 tick() 被传给 setTimeout 后独立调用,this 变成 undefined(严格模式)
- 箭头函数 autoTick = () => { this.count++ } 定义时已捕获当前实例,无论怎么传,this 始终是那个实例
注意边界:外层 this 本身可能已不是预期对象
如果外层普通函数的 this 本身就错了(比如被错误地赋值或脱离调用上下文),箭头函数会忠实地继承这个“错的 this”。
- 例如:在全局作用域定义箭头函数,外层是全局上下文,this 就是 window,哪怕你希望它指向某个对象
- 再如:把一个对象方法赋值给变量后调用,该方法的 this 已丢失,其内部箭头函数也会继承这个丢失后的 this(即 undefined 或 window)











