Методы callapply и bind являются методами функции в JavaScript и позволяют управлять контекстом выполнения функции, т.е. значением this.

Метод call позволяет вызывать функцию с явно заданным контекстом выполнения и передавать аргументы в виде отдельных значений. Первый аргумент метода call устанавливает значение this, а последующие аргументы передаются в вызываемую функцию. Например:

const person = {
  firstName: "John",
  lastName: "Doe",
  getFullName: function () {
    return this.firstName + " " + this.lastName
  },
}
 
const person2 = {
  firstName: "Jane",
  lastName: "Doe",
}
 
console.log(person.getFullName.call(person2)) // 'Jane Doe'

Метод apply работает аналогично методу call, но принимает аргументы в виде массива. Первый аргумент метода apply устанавливает значение this, а второй аргумент должен быть массивом аргументов, которые будут переданы в вызываемую функцию. Например:

const numbers = [1, 2, 3, 4, 5]
 
const sum = function () {
  return this.reduce(function (acc, val) {
    return acc + val
  }, 0)
}
 
console.log(sum.apply(numbers)) // 15

Метод bind позволяет создать новую функцию с жестко привязанным контекстом выполнения (значением this). Метод bind() возвращает новую функцию с привязанным контекстом. Эта новая функция может быть вызвана позже с любым количеством аргументов. Например:

const person = {
  firstName: "John",
  lastName: "Doe",
  getFullName: function () {
    return this.firstName + " " + this.lastName
  },
}
 
const logFullName = function () {
  console.log(this.getFullName())
}
 
const boundLogFullName = logFullName.bind(person)
 
boundLogFullName() // 'John Doe'

Основное отличие между call и apply заключается в том, как аргументы передаются в вызываемую функцию (в виде отдельных значений или массива соответственно), а bind создает новую функцию с жестко привязанным контекстом, которая может быть вызвана позже. При использовании этих методов важно помнить, что call и apply вызывают функцию немедленно, в то время как bind создает новую функцию, которая может быть вызвана позже.


Назад