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 | Возвращает функцию | По одному (можно частично) |