Skip to main content

call apply bind 区别

在 JavaScript 中,callapplybind 都是用来改变函数内部 this 指向的方法,但它们在执行时机和参数传递方式上有所不同。

1. 执行时机不同

  • callapply立即调用函数。
  • bind返回一个新函数,并不会立即执行,需要手动调用。

2. 参数传递方式不同

  • call:参数依次传递,用逗号分隔。
    fn.call(thisArg, arg1, arg2, ...)
  • apply:参数以数组(或类数组)形式传递。
    fn.apply(thisArg, [arg1, arg2, ...])
  • bind:参数可以预设(柯里化),调用新函数时再传入剩余参数。
    fn.bind(thisArg, arg1, arg2, ...)

3. 典型示例

const person = { name: 'Alice' };

function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}

// call:立即执行,参数逐个传递
greet.call(person, 'Hello', '!'); // Hello, Alice!

// apply:立即执行,参数以数组传递
greet.apply(person, ['Hi', '?']); // Hi, Alice?

// bind:返回新函数,稍后执行
const boundGreet = greet.bind(person, 'Hey');
boundGreet('...'); // Hey, Alice...

4. 其他注意事项

  • 在非严格模式下,thisArgnullundefined 时,会被替换为全局对象(浏览器中是 window)。
  • 严格模式下,thisArg 是什么就是什么(null 就是 null)。
  • bind 返回的函数也可以使用 new 操作符,此时预设的 this 会被忽略,但参数依然有效。

总结表

方法是否立即执行参数形式返回值
call参数列表,逗号分隔函数执行结果
apply数组或类数组函数执行结果
bind参数列表(可预设)绑定 this 的新函数