箭头函数不绑定this、arguments、super或new.target,其this沿作用域链继承自词法上最近的非箭头函数,arguments不可访问需外层捕获,且call/apply/bind对其无效。

箭头函数本身不绑定 this、arguments、super 或 new.target,它会沿作用域链向上查找这些值——这决定了它在复杂闭包链中“保存上下文”的本质:不是主动保存,而是被动继承外层普通函数的执行上下文。
箭头函数的 this 来源是定义时外层第一个普通函数
在多层嵌套函数中,箭头函数的 this 始终取自它**词法上最近的非箭头函数**的 this 值,而不是调用时的运行时环境。
- 如果外层没有普通函数(比如直接写在全局或对象方法之外),则
this指向全局对象(非严格模式)或undefined(严格模式) - 若中间夹着多个箭头函数,它们共享同一个外层普通函数的
this,不会因嵌套加深而改变 - 即使外层普通函数已被销毁(如返回后脱离调用栈),只要闭包还持有对它的引用,箭头函数仍能访问其
this
arguments 不可访问,需依赖外层函数的参数绑定
箭头函数没有自己的 arguments 对象。在闭包链中需要访问实参时,必须由外层普通函数显式捕获并传递。
- 常见做法:在外层函数中用数组扩展或
Array.from(arguments)转为数组,再通过参数或变量传给内层箭头函数 - ES6+ 更推荐用剩余参数替代:
function outer(...args) { return () => console.log(args); } - 不能在箭头函数里用
arguments,哪怕它嵌套在十个函数里也不行
闭包链越深,this 和变量的捕获越依赖外层函数生命周期
箭头函数形成的闭包会持有对外层函数活动对象(AO)或词法环境(Lexical Environment)的引用。这意味着:
立即学习“Java免费学习笔记(深入)”;
- 外层普通函数执行完毕后,若其
this或局部变量被内部箭头函数引用,它们不会被垃圾回收 - 若外层函数是构造函数或事件处理器,且箭头函数被长期持有(如赋值给对象属性、注册为回调),可能引发内存泄漏
- 调试时注意:Chrome DevTools 的 “Scope” 面板中,箭头函数的 Closure 下显示的是外层函数的变量,而非自身声明
避免陷阱:call/apply/bind 对箭头函数无效
因为箭头函数不绑定 this,所以显式绑定方法对其不起作用。
-
const fn = () => this.x; fn.call({x: 1})仍使用定义时的this,不是{x: 1} - 想动态控制
this?必须在外层普通函数中完成绑定,再让箭头函数继承该结果 - 常见误用:把事件监听器写成箭头函数并期望
bind(this)生效 —— 实际上 bind 被忽略,应改用普通函数或提前绑定好上下文再传入


















