call立即执行、逗号传参;apply立即执行、数组传参;bind不执行、返回新函数。选法取决于是否立即执行及参数形式:散参用call,数组用apply,预设上下文或柯里化用bind。

直接说重点:三者都用来改函数的 this 指向,但执行时机和参数写法不同——call 立即执行、逗号传参;apply 立即执行、数组传参;bind 不执行、返回新函数。选哪个,取决于你“要不要马上运行”和“参数是不是现成的数组”。
需要立刻执行函数?看参数怎么来
如果函数得马上跑,且你手头参数是分开的几个值(比如 name、age、city),用 call 最顺手:
greet.call(user, '小李', 25, '北京')
如果参数已经在一个数组里(比如 ['小王', 28, '上海']),别拆开再写,直接上 apply:
greet.apply(user, ['小王', 28, '上海'])- 经典例子:
Math.max.apply(null, [3, 7, 2])求数组最大值
需要预设 this 或部分参数?选 bind
bind 不执行,只打包配置。适合那些“先定好上下文,后面随时调用”的场景:
- 事件监听器里防止 this 丢失:
btn.addEventListener('click', handleClick.bind(obj)) - 提前填好一部分参数(柯里化):
const add10 = sum.bind(null, 10); add10(5); // 返回 15 - 绑定后还能被 call/apply 覆盖?不能——bind 的 this 是硬绑定,除非用 new 调用
容易踩坑的细节
非严格模式下,传 null 或 undefined 给 call/apply/bind,this 会自动变成全局对象(浏览器里是 window);严格模式下就是 undefined。
原始值(如字符串、数字)作 thisArg 会被自动包装:'hello'.toUpperCase.call(123) 中,123 变成 Number 实例。
注意:只有函数才有这三个方法,普通对象或数组调用会报错。
一句话总结怎么选
要马上跑 → 参数是散的用 call,参数是数组用 apply;
不急着跑、要复用或预设 → 用 bind。

















