箭头函数不绑定this,而是词法继承外层普通函数或全局作用域的this值;其this由定义位置决定,不受call、apply、bind影响,适用于回调、定时器等需保持上下文的场景。

箭头函数不绑定自己的 this,而是直接继承外层普通函数(或全局)作用域中的 this 值——这叫词法绑定,不是运行时动态绑定。
箭头函数的 this 由定义时的位置决定
它不会因为调用方式改变而改变,也不受 call、apply、bind 影响。只要看它写在哪一层函数里,就取那一层函数执行时的 this。
- 如果箭头函数直接写在全局作用域,它的
this就是全局对象(浏览器中是window,严格模式下是undefined) - 如果写在一个方法内部,就继承该方法调用时的
this - 嵌套多层也没关系,一直向上找,直到找到最近的非箭头函数作用域
对比普通函数和箭头函数的 this 行为
下面这个例子很典型:
const obj = {
name: 'Alice',
regular() {
console.log(this.name); // 'Alice'
setTimeout(function() {
console.log(this.name); // undefined(普通函数,this 指向 window)
}, 100);
setTimeout(() => {
console.log(this.name); // 'Alice'(箭头函数,继承 regular 的 this)
}, 100);
}
};
obj.regular();
关键点:第二个 setTimeout 里的箭头函数,其 this 不是 setTimeout 决定的,而是从 regular 方法体中“抄”来的。
立即学习“Java免费学习笔记(深入)”;
常见误用:试图用 call/bind 改变箭头函数的 this
这是无效的:
-
arrowFn.call({x: 1})——this仍是外层的值,不会变 -
arrowFn.bind({y: 2})()—— 同样无效,绑定被忽略 - 想动态控制
this?得用普通函数,或者把需要的值作为参数传进去
实用技巧:用箭头函数保持上下文一致
适合处理回调、事件监听、定时器等容易丢失 this 的场景:
- React 类组件中,事件处理器用箭头函数可避免手动
bind(this) - Vue 的生命周期钩子或方法里,用箭头函数访问
this.$data或this.$refs更稳妥 - 封装异步逻辑时,箭头函数天然保留外层实例上下文,减少
const self = this这类写法


















