JavaScript

В чём разница между call, apply и bind?

call, apply и bind

Все три метода позволяют явно задать this для функции.

call

Вызывает функцию немедленно, аргументы передаются через запятую.

function greet(greeting, punct) {
  return greeting + ", " + this.name + punct
}

const user = { name: "Иван" }
greet.call(user, "Привет", "!")  // "Привет, Иван!"

apply

Вызывает функцию немедленно, аргументы передаются массивом.

greet.apply(user, ["Привет", "!"])  // "Привет, Иван!"

// Классическое использование:
const numbers = [3, 1, 4, 1, 5]
Math.max.apply(null, numbers)  // 5
// Сейчас заменяется spread: Math.max(...numbers)

bind

Не вызывает функцию. Возвращает новую функцию с привязанным this.

const boundGreet = greet.bind(user, "Привет")
boundGreet("!")  // "Привет, Иван!"
boundGreet("?")  // "Привет, Иван?"

// Типичное использование - обработчики событий
class Button {
  constructor() {
    this.text = "Кнопка"
    this.handleClick = this.handleClick.bind(this)
  }
  handleClick() { console.log(this.text) }
}

Сводная таблица

ВызовАргументы
callНемедленноПо одному
applyНемедленноМассивом
bindВозвращает функциюПо одному (можно частично)

Источники