call、apply 和 bind 是 JavaScript 中实现方法借用的显示绑定方式:call 逐个传参并立即执行,apply 用数组传参并立即执行,bind 预设 this 和参数后返回可多次调用的新函数。

在 JavaScript 中,用 call 或 apply 就是显示绑定实现方法借用的最直接方式——它们能临时把一个对象的方法“借给”另一个对象执行,且立即调用。
用 call 借方法:传参逐个写
call 的第一个参数是 this 要指向的对象,后面跟的是按顺序传入的实参。
- 适合参数数量固定、明确的场景
- 比如借用数组方法处理类数组(如
arguments)
示例:
function say(greeting, punctuation) {return `${greeting}, I'm ${this.name}${punctuation}`;
}
const person = { name: 'Alice' };
say.call(person, 'Hello', '!'); // "Hello, I'm Alice!"
用 apply 借方法:参数用数组传
apply 的第一个参数也是 this 目标对象,第二个参数是一个数组(或类数组),用于批量传参。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适合参数动态生成、个数不固定的场景
- 常用于展开类数组(如
arguments、NodeList)调用数组原生方法
示例:
const numbers = [1, 5, 3];Math.max.apply(null, numbers); // 5
// 等价于 Math.max(1, 5, 3)
bind 也能借,但不立即执行
bind 返回一个新函数,this 被永久绑定,参数也可预设(柯里化),适合需要复用或延迟调用的场景。
- 返回函数可多次调用,this 不会变
- 预设部分参数后,后续调用只需补剩余参数
示例:
const greet = function(suffix) {return `Hi, ${this.name} ${suffix}`;
};
const boundGreet = greet.bind({ name: 'Bob' });
boundGreet('!'); // "Hi, Bob !"
boundGreet('?'); // "Hi, Bob ?"
注意 this 绑定优先级和常见坑
显示绑定(call/apply/bind)优先级高于隐式绑定和默认绑定,但会被 new 调用覆盖。
- 箭头函数没有自己的 this,无法被显示绑定改变
- 借用 DOM 方法时注意宿主环境兼容性(如 IE8- 不支持
Array.prototype.slice.callNodeList) - 严格模式下,
call(null)中的 this 是null,非严格模式会自动转为全局对象

















