call和apply,bind的区别

305 阅读1分钟

callapplybind 是 JavaScript 中用于管理函数执行时 this 指向的方法,它们的核心区别如下:

1. 执行时机

  • callapply:立即调用函数并执行。
  • bind:返回一个绑定了 this 和参数的新函数,需要后续手动调用。

2. 参数传递方式

  • call:接收参数列表,逐个传递。
    func.call(thisArg, arg1, arg2, ...);
    
  • apply:接收参数数组(或类数组对象)。
    func.apply(thisArg, [arg1, arg2, ...]);
    
  • bind:接收参数列表(可部分传入),返回的新函数在调用时可继续接收剩余参数。
    const boundFunc = func.bind(thisArg, arg1);
    boundFunc(arg2); // 参数合并为 [arg1, arg2]
    

3. this 绑定特性

  • callapply:仅临时修改本次函数调用的 this
  • bind:永久绑定 this(除非使用 new 调用)。后续通过 callapply 无法覆盖。
    const boundFunc = func.bind(obj1);
    boundFunc.call(obj2); // `this` 仍指向 obj1
    

4. new 操作符的交互

  • 使用 new 调用 bind 返回的函数时,绑定的 this 会被忽略,转而指向新创建的对象。
    function Person() {}
    const BoundPerson = Person.bind({});
    const instance = new BoundPerson(); // `instance` 是 Person 的实例
    

总结表格

方法执行时机参数形式返回this 绑定是否可变
call立即执行参数列表是(仅本次调用)
apply立即执行参数数组是(仅本次调用)
bind延迟执行参数列表(可部分)新函数否(除非 new 调用)

示例

function greet(greeting, punctuation) {
  console.log(`${greeting}, ${this.name}${punctuation}`);
}

const alice = { name: 'Alice' };

// call
greet.call(alice, 'Hello', '!'); // Hello, Alice!

// apply
greet.apply(alice, ['Hi', '?']); // Hi, Alice?

// bind
const boundGreet = greet.bind(alice, 'Hey');
boundGreet('!!'); // Hey, Alice!!

关键区别call/apply 直接执行并灵活修改 this,而 bind 创建固定 this 的新函数,支持参数柯里化。