箭头函数没有自己的this,其this值在定义时就继承自外层非箭头函数的词法作用域,且不可被call、apply、bind修改;在全局定义时指向全局对象(严格模式为undefined),在对象方法内定义时指向该对象,嵌套时始终沿用最外层普通函数的this。

箭头函数没有自己的 this,它的 this 直接沿用定义时所在词法作用域的 this 值,而不是调用时决定的。
为什么说“没有自己的 this”?
普通函数每次执行时,引擎会根据调用方式(如 obj.method()、func()、new Func() 等)动态绑定 this;而箭头函数在创建时就“冻结”了外层作用域的 this,之后无论怎么调用,都不会改变——它不参与任何 this 绑定规则(默认/隐式/显式/new),也无法被 call、apply、bind 修改。
它从哪继承 this?
继承的是**定义时最近一层非箭头函数的 this**。常见情况包括:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在全局作用域中定义 → this 指向全局对象(浏览器为
window,严格模式下为undefined) - 在对象方法内定义 → this 指向该对象(因为外层普通函数的 this 已由隐式绑定确定)
- 在构造函数或类方法中定义 → this 指向 new 出来的实例
- 嵌套多层箭头函数 → 始终沿用最外层那个普通函数的 this,不会逐层向上找
典型陷阱与正确写法
常见错误是误以为箭头函数能“自动绑定”到某个对象,其实它只是“抄作业”:
立即学习“Java免费学习笔记(深入)”;
-
错:把箭头函数直接挂到对象上,指望 this 指向该对象
const obj = { name: 'Alice', greet: () => console.log(this.name) };
→ this 是外层作用域的,不是obj,结果通常是undefined -
对:在对象方法内部定义箭头函数,利用外层已绑定的 this
const obj = { name: 'Alice', sayHi() { const inner = () => console.log(this.name); inner(); } };
→sayHi的 this 是obj,箭头函数继承它,输出Alice - 事件回调、定时器中常用箭头函数避免 this 丢失,正是因为其继承外层方法的 this
和普通函数对比一眼看穿
下面两个函数行为完全不同:
-
function normal() { console.log(this); }→ 谁调用,this 就是谁 -
const arrow = () => { console.log(this); }→ 定义它时,外层 this 是谁,它就是谁,调用方式完全无关

















