返回

关于call、apply和bind的方法

前端

call、apply和bind方法的概述

在JavaScript中,call、apply和bind方法都是用来改变函数的this的指向的。这三个方法都有一个共同的第一个参数,即用来改变this指向的对象。不同的是,apply的第二个参数接受的是一个数组,而call和bind接受的则是连续的参数。

call方法

call方法的语法如下:

Function.call(thisArg, arg1, arg2, ...)

其中,

  • Function:要调用的函数。
  • thisArg:用来改变this指向的对象。
  • arg1, arg2, ...:要传递给函数的参数。

call方法的用法如下:

function greet(name) {
  console.log(`Hello, ${name}!`);
}

const person = {
  name: 'John'
};

greet.call(person, 'John'); // Hello, John!

在上面的示例中,greet函数被调用了两次。第一次,this指向greet函数本身,所以console.log()输出的是Hello, undefined!。第二次,greet函数被调用时,this指向person对象,所以console.log()输出的是Hello, John!

apply方法

apply方法的语法如下:

Function.apply(thisArg, argsArray)

其中,

  • Function:要调用的函数。
  • thisArg:用来改变this指向的对象。
  • argsArray:一个包含要传递给函数的参数的数组。

apply方法的用法如下:

function greet(name) {
  console.log(`Hello, ${name}!`);
}

const person = {
  name: 'John'
};

const args = ['John'];

greet.apply(person, args); // Hello, John!

在上面的示例中,greet函数被调用了两次。第一次,this指向greet函数本身,所以console.log()输出的是Hello, undefined!。第二次,greet函数被调用时,this指向person对象,所以console.log()输出的是Hello, John!

bind方法

bind方法的语法如下:

Function.bind(thisArg, arg1, arg2, ...)

其中,

  • Function:要调用的函数。
  • thisArg:用来改变this指向的对象。
  • arg1, arg2, ...:要传递给函数的参数。

bind方法的用法如下:

function greet(name) {
  console.log(`Hello, ${name}!`);
}

const person = {
  name: 'John'
};

const boundGreet = greet.bind(person);

boundGreet(); // Hello, John!

在上面的示例中,greet函数被调用了两次。第一次,this指向greet函数本身,所以console.log()输出的是Hello, undefined!。第二次,greet函数被调用时,this指向person对象,所以console.log()输出的是Hello, John!

call、apply和bind方法的比较

下表比较了call、apply和bind方法的异同:

特性 call apply bind
语法 Function.call(thisArg, arg1, arg2, ...) Function.apply(thisArg, argsArray) Function.bind(thisArg, arg1, arg2, ...)
第二个参数 连续的参数 数组 连续的参数
返回值 一个新的函数

结论

call、apply和bind方法都是用来改变函数的this关键字的指向的。这三个方法都有一个共同的第一个参数,即用来改变this指向的对象。不同的是,apply的第二个参数接受的是一个数组,而call和bind接受的则是连续的参数。