bind返回绑定this和预设参数的新函数,不立即执行;call和apply立即执行,call传参逐个列出,apply以数组形式传参。

JavaScript 中的 bind、call 和 apply 都是用来**改变函数内部 this 指向**的方法,但它们的调用方式和返回结果不同。理解三者区别,是掌握 JS 执行上下文和函数式编程的关键。
bind:返回新函数,不立即执行
bind 会创建一个新函数,把原函数的 this 永久绑定到指定对象,并可预设部分参数(柯里化)。调用时才真正执行。
- 语法:
fn.bind(thisArg, arg1, arg2, ...) - 返回值:一个绑定好
this和部分参数的新函数 - 常用于事件监听、回调传参、构造函数复用等场景
例如:
const user = { name: 'Alice' };function greet(greeting, punctuation) {
return `${greeting}, ${this.name}${punctuation}`;
}
const greetAlice = greet.bind(user, 'Hello');
console.log(greetAlice('!')); // "Hello, Alice!"
call:立即执行,参数逐个传入
call 立即调用函数,并将 this 指向第一个参数指定的对象,其余参数按顺序依次传入。
立即学习“Java免费学习笔记(深入)”;
- 语法:
fn.call(thisArg, arg1, arg2, ...) - 适用于需要临时切换上下文并立刻运行的场景
- 常用于借用方法(如数组方法处理类数组)
例如:
const arrLike = { 0: 'a', 1: 'b', length: 2 };Array.prototype.forEach.call(arrLike, (item) => console.log(item));
// 输出 'a' 和 'b'
apply:立即执行,参数以数组形式传入
apply 和 call 功能一致,只是参数接收方式不同:它把第二个参数作为数组(或类数组)一次性传入。
- 语法:
fn.apply(thisArg, [arg1, arg2, ...]) - 适合参数数量不确定、已存在参数数组的情况
- 经典用途:求最大/最小值、合并数组等
例如:
const numbers = [3, 7, 1];Math.max.apply(null, numbers); // 7
// 等价于 Math.max(3, 7, 1)
三者核心对比
相同点:都能显式控制函数调用时的 this;
不同点:
-
bind 返回函数,延迟执行;
call和apply立即执行 - call 参数展开传;apply 参数打包成数组传
- ES6 后,可用展开运算符
...替代apply大部分用途,如Math.max(...numbers)










