箭头函数没有自己的this,其this值在定义时就继承自外层第一个非箭头函数的词法作用域,不可被call、apply、bind修改;在全局定义时指向全局对象(严格模式为undefined),在对象方法或类中定义时则继承外层已绑定的this,适用于事件回调、定时器等需保持上下文的场景。

箭头函数本身不绑定 this,它会沿作用域链向上查找外层非箭头函数的 this 值。所以“绑定正确的上下文”不是靠箭头函数自己完成的,而是靠它定义时所处的词法环境决定的。
箭头函数的 this 是词法绑定的
它没有自己的 this,不会因为调用方式(如 obj.fn()、fn.call(obj))而改变。它的 this 值在函数定义时就确定了,等于外层第一个普通函数(或全局作用域)的 this。
- 在对象方法中直接写箭头函数,
this通常指向外层函数的this,而不是对象本身 - 在类的构造函数或方法中定义箭头函数,它能“捕获”当前实例的
this,适合用作事件回调或定时器 - 在全局作用域定义箭头函数,它的
this指向全局对象(浏览器中是window,严格模式下是undefined)
什么时候该用箭头函数来“固定 this”
典型场景是需要把函数作为回调传出去,又希望它内部访问当前实例的属性或方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- React 类组件中定义事件处理函数:
handleClick = () => { console.log(this.state); } - 定时器或异步回调中访问实例:
setTimeout(() => { this.update(); }, 100); - 数组方法的回调需访问外部
this:list.map(item => this.process(item));
什么时候不该用箭头函数
以下情况使用箭头函数会导致错误或不符合预期:
立即学习“Java免费学习笔记(深入)”;
- 定义对象方法:
const obj = { fn: () => console.log(this); }——this不是obj,而是外层作用域的this - 需要动态
this的场景,比如 jQuery 或原生 DOM 事件监听器期望this指向触发元素 - 构造函数(箭头函数不能用
new调用) - 需要访问
arguments、super或new.target的地方(箭头函数没有这些)
替代方案:显式绑定 this
如果必须用普通函数但又要控制 this,可用以下方式:
-
fn.bind(obj)—— 返回新函数,this永远是obj -
obj.fn.call(obj, ...args)或obj.fn.apply(obj, args)—— 立即调用并指定this - ES6 解构 + 参数重命名:
const { method } = obj; method();(但此时this会丢失,仍需 bind 或箭头包裹)

















