JavaScript 中的 Call、apply 和 bind 都是用来改变函数的执行上下文(即 this 指向)的方法,但它们之间有些区别:
- Call 和 apply
Call 和 apply 都是 Function.prototype 的方法。它们的作用是改变函数的 this 指向,并立即执行函数。它们的区别只在于传入参数的方式。
function greeting(name) {
console.log(`Hello, ${name}!`,this);
}
function greeting1() {
this.name = ''
}
greeting.call(null, 'John'); // Hello, John!,window
greeting.apply(null, ['John']); // Hello, John!,window
greeting.call(greeting1, 'John'); // Hello, John!,greeting1()
greeting.apply(greeting1, ['John']); // Hello, John!,greeting1()
他们的第一个参数就是改变this指向的关键,如上,传入其他对象或函数,this指向就发生了改变,如果传入null 就默认指定window对象
第二各参数Call 方法接收的是一个参数列表,而 apply 方法接收的是一个数组。
- Bind
Bind 方法也能改变函数的 this 指向,但它不会立即执行函数,而是返回一个新函数,需要调用才会执行。
function greeting(name) {
console.log(`Hello, ${name}!`,this);
}
const greetJohn = greeting.bind(null, 'John');
greetJohn(); // Hello, John!,window
Bind 方法的第一个参数是 this 指向,后面的参数是要在调用时传入到原函数中的值。如果在调用 bind 时不传入 this 指向,那么默认为 undefined。传入null时它的this指向就是谁调用指向谁
需要注意的是,bind 方法返回的是一个新函数,如果原函数有返回值,那么绑定后的函数也会返回相同的值。
综上所述,Call 和 apply 用来改变函数的 this 指向并立即执行,而 bind 则是用来绑定函数与 this 的关系,返回一个新的函数。