箭头函数的this在定义时词法绑定,继承外层非箭头函数执行时的this,无法被call/apply/bind或对象调用改变;全局中指向window(严格模式undefined),对象方法内则继承该方法的this。

箭头函数的 this 不是运行时决定的,它在函数定义那一刻就“记住了”外层普通函数执行时的 this 值,这个过程叫词法绑定。
词法绑定的核心表现
箭头函数没有自己的 this,它直接沿用定义位置所在作用域中最近的那个非箭头函数的 this。这个值一旦确定,就不可更改——call、apply、bind 全部无效,对象方法调用(如 obj.fn())也影响不了它。
- 如果箭头函数写在全局作用域,它继承的是全局 this(浏览器中是
window,严格模式下是undefined) - 如果写在一个普通对象方法内部,它就继承那个方法执行时的 this(通常是该对象)
- 如果嵌套多层普通函数,它会一直向上找,直到遇到第一个非箭头函数的执行上下文
为什么对象字面量里直接写箭头函数会出错
像这样写是常见误区:
const obj = {
name: 'Alice',
say: () => console.log(this.name) // this 指向 window 或 undefined,不是 obj
};
因为对象字面量本身不创建函数执行上下文,say 是在全局词法环境中定义的,所以它的 this 和 obj 完全无关。要让 this 指向 obj,必须用普通函数或把箭头函数放在一个能产生正确 this 的函数体内。
箭头函数适合用在哪
它真正发挥作用的地方,是需要“保持外层上下文”的场景:
- 定时器回调:
setInterval(() => { this.count++ }, 1000),避免 this 指向window - 事件监听器:
button.addEventListener('click', () => this.handleClick()),不用手动bind - 数组高阶方法:
users.map(user => user.name),这里不需要 this,但若内部需访问外层实例属性,箭头函数自然支持 - 类中定义实例方法(作为类字段):
handleClick = () => { ... },确保传递后 this 不丢失
和普通函数对比的关键区别
普通函数的 this 是动态的:谁调、怎么调,就指向谁;箭头函数的 this 是静态的:在哪写、外层是谁,就永远是谁。这不是语法糖,而是设计上的根本差异——它牺牲了灵活性,换来了在回调场景下的稳定性与简洁性。











