call、apply 和 bind
JavaScript 中 `call`、`apply` 和 `bind` 的共同点与差异,以及它们和 this 绑定的关系。
#resource / javascript
#type / concept
#status / growing
[!info] related notes
- 所属 MOC: ecmascript-moc
- 相关概念: this-keyword, equality-operators
- 面试问法: call-apply-bind-interview-question
call、apply 和 bind
这三个方法都和函数调用时的 this 指向有关。
一句话定义
call:立即调用函数,参数逐个传apply:立即调用函数,参数以数组形式传bind:不立即调用,返回一个绑定好this的新函数
最小例子
fn.call(obj, 1, 2)
fn.apply(obj, [1, 2])
const newFn = fn.bind(obj, 1, 2)
共同点
它们都能显式指定函数执行时的 this。
差异
call
- 立即执行
- 适合已知参数列表的场景
apply
- 立即执行
- 适合参数已经在数组里的场景
bind
- 不会立刻执行
- 更像提前生成一个“this 已固定”的新函数
- 适合事件回调、延迟执行、函数柯里化一类场景
最容易误解的点
bind返回的是新函数,不是执行结果- 箭头函数没有自己的
this,所以对箭头函数使用这三者时,经常看不到预期效果
最短记忆方式
call/apply 立刻调,bind 先绑后用。
面试要点
来自 call-apply-bind-interview-question 的面试视角整理。
一句话回答
它们都能显式改变函数执行时的 this,区别在于 call 和 apply 会立刻调用,bind 会返回一个绑定后的新函数。
最稳的回答主线
共同点
- 都和
this绑定有关
差异
call:参数逐个传,立刻执行apply:参数数组传,立刻执行bind:不立刻执行,返回新函数
场景化表达
- 已知参数列表时常见
call - 参数天然就是数组时常见
apply - 事件回调、延迟执行时常见
bind
最短记忆方式
call/apply 直接调,bind 返回新函数。