箭头函数的this是词法绑定的,定义时即确定并不可更改,因此call、apply、bind无法改变其this值,传入的this参数被忽略。

因为箭头函数没有自己的 this 绑定,它会沿作用域链向上查找外层普通函数的 this,而 call、apply、bind 只能改变**拥有独立 this 的函数**的执行上下文——箭头函数不满足这个前提。
箭头函数的 this 是词法绑定的
箭头函数的 this 在定义时就已确定,取自外层第一个普通函数(或全局)的 this 值,之后不可更改。它没有内部的 this 机制,也不参与运行时的上下文绑定流程。
- 定义时就“捕获”外层
this,类似闭包捕获变量 - 没有
[[ThisBindingStatus]]内部槽(ECMAScript 规范中用于标识this是否已绑定) - 调用时直接使用定义时确定的
this,跳过标准的this绑定逻辑
call/apply/bind 依赖函数自身的 this 绑定能力
这三个方法本质是通过临时修改函数执行时的 this 参数来实现上下文切换,但前提是该函数必须支持运行时 this 绑定——即它是“可调用对象”,且具有可被覆盖的 this。
- 普通函数调用时,
this默认由调用方式决定(如obj.fn()→this = obj),call等可强行覆盖 - 箭头函数没有“调用时绑定
this”这一步,它的this已在解析阶段固化 -
bind返回的新函数仍为箭头函数,同样无法重新绑定this
实际表现:传入的 this 被忽略
对箭头函数调用 call、apply 或 bind 时,第一个参数(期望作为 this 的值)会被完全忽略,函数内部的 this 仍保持定义时的值。
const obj1 = { name: 'Alice' };
const obj2 = { name: 'Bob' };
const arrow = () => console.log(this.name);
// 即使显式传入 obj2,this 仍是定义时的全局/外层 this
arrow.call(obj2); // 输出 undefined(严格模式)或 globalThis.name(非严格)
若箭头函数定义在某个普通函数内,其 this 就继承那个普通函数的 this,后续任何 call 都无法动摇它。
替代方案:需要动态 this 时,用普通函数
如果业务逻辑依赖运行时切换 this(例如事件回调、数组方法中的回调需访问特定对象),应避免使用箭头函数,改用传统函数声明或表达式。
- 用
function() {}或function fn() {}—— 支持call/apply/bind - 若需保留词法作用域又想控制
this,可用普通函数 + 显式参数传递代替this - ES6+ 中也可借助类方法、
bind实例方法(绑定在普通函数上)等方式解耦
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











