Методы call и apply

27-05-24 18:18:00


Image for the Методы call и apply

Метод call

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

Синтаксис:

function.call(thisArg, arg1, arg2, ...)

Пример:

​function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}

const person = { name: 'John' };

greet.call(person, 'Hello', '!'); // Вывод: Hello, John!

В этом примере greet.call(person, 'Hello', '!') устанавливает this на объект person, позволяя функции greet получить доступ к person.name.

Метод apply

Метод apply похож на call, но принимает аргументы в виде массива (или объекта, подобного массиву).

Синтаксис:

​function.apply(thisArg, [argsArray])

Пример:

​function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}

const person = { name: 'Jane' };

greet.apply(person, ['Hi', '?']); // Вывод: Hi, Jane?

В этом примере greet.apply(person, ['Hi', '?']) устанавливает this на объект person, аналогично методу call, но аргументы передаются в виде массива.

Заимствование методов

Один из распространенных случаев использования методов call и apply — заимствование методов, когда вы используете метод одного объекта на другом объекте.

Пример:

​const obj1 = { name: 'Alice' };
const obj2 = { name: 'Bob' };

function sayName() {
console.log(this.name);
}

sayName.call(obj1); // Вывод: Alice
sayName.call(obj2); // Вывод: Bob

Здесь функция sayName вызывается с различными контекстами (obj1 и obj2), демонстрируя заимствование методов.

Использование apply для функций с переменным количеством аргументов

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

Пример:

​function sum(a, b, c) {
return a + b + c;
}

const numbers = [1, 2, 3];

console.log(sum.apply(null, numbers)); // Вывод: 6

В этом примере sum.apply(null, numbers) передает элементы массива numbers как отдельные аргументы функции sum.

Использование call и apply с встроенными методами

Вы можете использовать методы call и apply со встроенными методами для работы с массивами и объектами.

Пример:

​const arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };

const array = Array.prototype.slice.call(arrayLike);
console.log(array); // Вывод: ['a', 'b', 'c']

Здесь Array.prototype.slice.call(arrayLike) преобразует объект, подобный массиву, в настоящий массив.

Методы call и apply в JavaScript — универсальные инструменты, позволяющие явно устанавливать контекст this для выполнения функции. Они позволяют заимствовать методы, облегчают работу с переменным количеством аргументов и предоставляют способ использования встроенных методов для различных типов объектов.