箭头函数的词法作用域在定义时确定,静态捕获外层变量(含this、super等),不依赖调用方式;其this继承自外层最近非箭头函数作用域,无法被call/apply/bind修改;返回对象需用括号包裹。

词法作用域在箭头函数创建时就已确定,不是运行时决定的——它直接捕获定义时外层函数或全局作用域中的变量,不依赖调用方式。
箭头函数靠闭包“记住”外层变量
箭头函数本身没有独立的作用域链,而是通过闭包机制,把定义位置所在词法环境里的变量(包括 const/let 声明的局部变量、参数、this、super 等)静态地绑定进来。
- 只要变量在箭头函数书写位置的外层作用域中存在,就能访问,哪怕外层函数已经执行结束
- 例如在 for 循环里创建多个箭头函数,它们各自捕获的是每次迭代时的块级变量(let 声明),不会全部共享最后一个值
- 这和 var 声明+普通函数不同:var 会提升且无块级绑定,容易导致意外共享
this 的词法绑定是其中一部分
箭头函数的 this 不是动态查找的,而是从外层最近的非箭头函数作用域继承而来,并在函数创建那一刻就固定下来。
- 如果定义在全局,this 就是 window 或 globalThis
- 如果定义在某个类方法内部,this 就指向该类实例(因为外层普通方法的 this 已被正确绑定)
- call、apply、bind 对它无效——它根本没自己的 this 绑定逻辑
注意外层必须存在有效的词法环境
箭头函数不能凭空“创造”作用域;它的词法作用域取决于它写在哪里。
- 写在对象字面量里(如 obj = { fn: () => this }),this 指向外层作用域(通常是全局),而非 obj 本身
- 写在 class 的字段位置(如 autoTick = () => this.count++),this 指向当前实例,因为外层就是类构造上下文
- 写在立即执行函数表达式(IIFE)内部,就捕获 IIFE 的参数和变量
返回对象字面量要加括号
语法上,箭头函数若要直接返回对象,必须用小括号包裹,否则花括号会被解析为函数体:
- x => ({ a: 1 }) ✅ 返回对象
- x => { a: 1 } ❌ 这是函数体,其中 a: 1 是标签语句,不返回任何值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











