call apply bind 区别
在 JavaScript 中,call、apply 和 bind 都是用来改变函数内部 this 指向的方法,但它们在执行时机和参数传递方式上有所不同。
1. 执行时机不同
call和apply:立即调用函数。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. 其他注意事项
- 在非严格模式下,
thisArg为null或undefined时,会被替换为全局对象(浏览器中是window)。 - 严格模式下,
thisArg是什么就是什么(null就是null)。 bind返回的函数也可以使用new操作符,此时预设的this会被忽略,但参数依然有效。
总结表
| 方法 | 是否立即执行 | 参数形式 | 返回值 |
|---|---|---|---|
call | 是 | 参数列表,逗号分隔 | 函数执行结果 |
apply | 是 | 数组或类数组 | 函数执行结果 |
bind | 否 | 参数列表(可预设) | 绑定 this 的新函数 |