箭头函数没有自己的this绑定,this从外层作用域词法继承并锁定。call或apply的第一个参数被忽略,无法改变this指向,但第二个参数可正常传递。箭头函数也不具备arguments和动态上下文能力,bind同样无效,仅支持参数预绑定。
箭头函数为何不能用call/apply
作者:技术拾光
时间:2026-07-25
浏览:127
文章目录
箭头函数为什么不能用call或apply改变this指向?这是许多开发者都遇到过的问题。先说结论:根本原因其实很简单——箭头函数本身没有自己的this绑定机制。

箭头函数的 this 是词法继承,不是动态绑定
普通函数的this在每次调用时动态确定,取决于调用方式和调用者——比如obj.fn()中this指向obj。而箭头函数在定义时就从外层作用域“继承”了this值,并且永久锁定。后续任何调用方式都不会改变它。
- 这个
this可能是全局对象(如浏览器中的window),也可能是某个外层函数的this,甚至undefined(严格模式或模块顶层)。 call和apply的设计逻辑是“临时将函数挂到目标对象上再执行”,但箭头函数体内没有可被覆盖的this存储位置——挂上去也没有地方写入。
call/apply 的第一个参数被忽略
当你执行arrowFn.call({x: 1}, 'a', 'b')或arrowFn.apply({x: 1}, ['a', 'b'])时,传入的{x: 1}会被完全忽略。函数内部的this仍是定义箭头函数时所在环境的this。
- 不会报错,但也不会生效——这是符合规范的行为,并非bug。
- 第二个参数(实参数组)可以正常传递并接收,只是
this不受影响。
它也不具备 arguments 和动态上下文能力
call和apply常用于借用方法,例如Array.prototype.slice.call(arguments)。但箭头函数连arguments对象都没有,更无法参与这类基于运行时上下文的操作。
- 想访问参数,必须使用rest参数:
(...args) => {...}。 - 需要借用数组方法?得用普通函数,或者改用扩展运算符(如
Math.max(...arr))。 - 需要在事件回调中访问实例属性?不要用箭头函数,否则
this指向会出错。
bind 同样无效,但参数预绑定仍可用
bind返回的新函数仍是箭头函数,this不变。不过它支持参数预置——但这部分和this无关。
- 例如:
const fn = (a, b) => console.log(this.val, a, b); const bound = fn.bind({val: 'no effect'}, 1); bound(2);输出的是原始this.val(比如undefined),而不是'no effect'。 - 但
a会是1,b会是2——参数传递照常工作。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。