Различие методов call apply bind
Методы `call`, `apply` и `bind` принадлежат к функциональному объекту `Function` и используются для указания контекста `this` при вызове функции. Хотя все три метода позволяют контролировать значение `this` внутри функции, между ними существуют ключевые различия в способе использования и поведении.
call
Вызывает функцию, явно устанавливая `this` в первом аргументе. Остальные аргументы передаются в вызываемую функцию как есть.
Пример:
function greet(message, name) {
console.log(`${message}, ${name}. This is ${this}`);
}
greet.call("Earth", "Hello", "Alice"); // "Hello, Alice. This is Earth"
Здесь он используется для вызова функции `greet` с `this`, установленным в `"Earth"`, и двумя дополнительными аргументами `"Hello"` и `"Alice"`.
apply
Очень похож на `call`, но принимает аргументы в виде массива, а не по отдельности.
Пример:
function greet(message, name) {
console.log(`${message}, ${name}. This is ${this}`);
}
greet.apply("Earth", ["Hello", "Alice"]); // "Hello, Alice. This is Earth"
В этом случае он вызывает функцию `greet` с `this`, установленным в `"Earth"`, и аргументами, переданными в виде массива.
bind
Создаёт новую функцию, которая, когда она вызывается, имеет установленный контекст `this`, указанный в первом аргументе. В отличие от `call` и `apply`, `bind` не вызывает функцию сразу, а возвращает новую функцию, которую можно вызвать позже.
Пример:
function greet(message, name) {
console.log(`${message}, ${name}. This is ${this}`);
}
const greetEarth = greet.bind("Earth", "Hello", "Alice");
greetEarth(); // "Hello, Alice. This is Earth"
Здесь он используется для создания новой функции `greetEarth`, которая при вызове выводит тот же результат, что и предыдущие примеры, но с тем отличием, что контекст `this` и аргументы были заранее заданы.
- `call` вызывает функцию с указанным контекстом `this` и отдельными аргументами.
- `apply` аналогичен `call`, но принимает аргументы в виде массива.
- `bind` создаёт новую функцию с предустановленным контекстом `this` и аргументами, если они были предоставлены, но не вызывает её немедленно.
Эти методы позволяют более гибко управлять контекстом выполнения функций, что является мощным инструментом, особенно при работе с объектно-ориентированным кодом и асинхронными вызовами.
Feb. 22, 2024, easyoffer