箭头函数不能通过call、apply或bind改变this指向,因其没有自己的this绑定机制,this值在定义时就词法继承外层作用域,与调用方式无关,且call/apply/bind对其无效。

箭头函数不能通过 call、apply 或 bind 改变 this 指向,根本原因在于它**没有自己的 this 绑定机制**。
箭头函数的 this 是词法继承的
它的 this 值在函数定义时就已确定,直接沿用外层普通函数(或全局)作用域的 this,和调用方式完全无关。也就是说,不是“运行时决定”,而是“写的时候就锁死了”。
- 哪怕你把箭头函数赋值给另一个对象再调用,
this也不变 - 哪怕用
obj.fn.call(otherObj)显式绑定,也毫无效果 - 它不参与 JavaScript 默认的动态
this绑定规则
call/apply/bind 的作用对象是“有 this 的函数”
这三个方法本质是为普通函数设计的:它们通过临时替换执行上下文来重定向 this。但箭头函数内部压根没有 this 可供替换——它连 this 的存储槽都没有。
-
call和apply会静默忽略第一个参数(即你想绑定的对象) -
bind返回的新函数仍是箭头函数,this依然继承原外层作用域 - 不会报错,但也不会生效,属于“无效操作”
对比普通函数就能看清区别
假设外层 this 指向 { name: 'Alice' }:
立即学习“Java免费学习笔记(深入)”;
- 普通函数:
function() { return this.name; }→call({name:'Bob'})返回'Bob' - 箭头函数:
() => this.name→ 即使用call({name:'Bob'}),仍返回'Alice'
什么时候容易踩这个坑
常见于事件回调、定时器、异步操作中误用箭头函数替代普通函数:
- 想让
setTimeout(() => console.log(this.val), 100)中的this指向某个实例?不行,得用普通函数或提前缓存const self = this - 在对象方法里写
clickHandler: () => this.doSomething(),结果this指向全局而非该对象 - 用
Array.prototype.map时传入箭头函数没问题,但若依赖this上下文,就得确认外层this是否如你所愿


















