箭头函数的this继承定义时外层作用域的this且不可变,普通函数的this由调用方式动态决定:对象方法调用指向该对象,单独调用非严格模式下为window、严格模式下为undefined,call/apply/bind可显式绑定,new调用指向新实例。

箭头函数的 this 不是运行时决定的,而是写在哪、定义在哪个作用域里,就固定继承那个地方的 this;普通函数的 this 则完全看“谁调用它”,每次调用都可能不同——这是最核心、最常踩坑的区别。
普通函数的 this 是动态的,取决于调用方式
普通函数没有预设的 this,它只在执行那一刻才确定指向谁:
- 作为对象方法调用:this → 该对象(
obj.fn()→this是obj) - 单独调用(无主语):非严格模式下指向
window或globalThis,严格模式下为undefined - 被
call/apply/bind显式绑定:this → 指定的对象 - 作为构造函数用
new调用:this → 新创建的实例
箭头函数没有自己的 this,只捕获外层定义时的 this
箭头函数体内根本不存在 this 绑定机制,它会一层层向外查找,直到找到最近的非箭头函数作用域,并复用那个作用域的 this 值。这个值一旦确定,永远不变:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在全局作用域定义 → 继承全局 this(通常是
window) - 在某个普通函数内部定义 → 继承该普通函数执行时的 this
- 无法用
call/apply/bind修改 this,传参有效,改 this 失效 - 不能用作对象方法(如
obj: { fn: () => {} }),因为 this 不会指向obj
典型场景:回调函数中避免 this 丢失
比如定时器或事件监听里,普通函数容易因调用脱离对象而丢失上下文:
- 普通函数写法需手动保存:
const that = this; setInterval(function() { console.log(that.name); }, 1000); - 箭头函数天然解决:
setInterval(() => { console.log(this.name); }, 1000);—— this 直接沿用外层类/对象实例的 this
其他连带差异也源于 this 机制不同
因为箭头函数不绑定 this,它也不具备与之配套的运行时特性:
- 没有
arguments对象(可用 rest 参数...args替代) - 没有
prototype属性,不能用new当构造函数 - 没有
super和new.target - 一定是匿名函数,不能通过函数名递归调用自身
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










