返回

apply、call、bind 函数手写实现,搞懂更轻松

前端

在 JavaScript 中,apply、call 和 bind 函数都是用来改变函数的 this 指向的,但它们之间还是存在着一些细微的差异。

apply

apply 函数接受两个参数:第一个参数是将要被调用的函数,第二个参数是一个数组,其中包含了要传递给该函数的参数。当 apply 函数被调用时,它会将第一个参数作为 this 指向,然后将第二个参数中的元素作为参数传递给该函数。

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

const person = {
  name: 'John'
};

greet.apply(person, ['Mary']); // Hello, Mary!

call

call 函数与 apply 函数非常相似,但它接受的参数有所不同。call 函数接受三个参数:第一个参数是将要被调用的函数,第二个参数是将作为 this 指向的值,第三个参数是一个包含要传递给该函数的参数的数组。当 call 函数被调用时,它会将第二个参数作为 this 指向,然后将第三个参数中的元素作为参数传递给该函数。

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

const person = {
  name: 'John'
};

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

bind

bind 函数与 apply 和 call 函数有所不同,它不会立即调用函数,而是返回一个新的函数。这个新函数的 this 指向被绑定到了 bind 函数的第一个参数,而传递给 bind 函数的其他参数则作为新函数的参数。当这个新函数被调用时,它会使用 bind 函数的第一个参数作为 this 指向,并将传递给它的参数作为参数。

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

const person = {
  name: 'John'
};

const greetJohn = greet.bind(person);

greetJohn('Mary'); // Hello, Mary!

总结

apply、call 和 bind 函数都是用来改变函数的 this 指向的,但它们之间还是存在着一些细微的差异。

  • apply 函数接受两个参数:第一个参数是将要被调用的函数,第二个参数是一个数组,其中包含了要传递给该函数的参数。
  • call 函数接受三个参数:第一个参数是将要被调用的函数,第二个参数是将作为 this 指向的值,第三个参数是一个包含要传递给该函数的参数的数组。
  • bind 函数与 apply 和 call 函数有所不同,它不会立即调用函数,而是返回一个新的函数。这个新函数的 this 指向被绑定到了 bind 函数的第一个参数,而传递给 bind 函数的其他参数则作为新函数的参数。

希望本文能帮助你更好地理解 apply、call 和 bind 函数的原理和使用方法。