← Назад к вопросам

Для чего используется Apply?

2.0 Middle🔥 201 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Метод apply() в JavaScript

Основное назначение

apply() — это метод Function, который позволяет вызвать функцию с указанным контекстом (значением this) и передать аргументы в виде массива или array-like объекта. Это один из трёх способов управления контекстом выполнения функции наряду с call() и bind().

Синтаксис

function.apply(thisArg, [argsArray])
  • thisArg — объект, который будет использоваться как this внутри функции
  • argsArray — массив (или array-like) аргументов для функции

Основные использования

1. Изменение контекста (this)

Самое распространённое использование — явное указание, какой объект должен быть this:

const user = {
  name: "Алиса",
  greet: function(greeting) {
    return `${greeting}, ${this.name}!`;
  }
};

const anotherUser = { name: "Боб" };

// Вызываем метод user с контекстом anotherUser
const result = user.greet.apply(anotherUser, ["Привет"]);
console.log(result); // "Привет, Боб!"

2. Передача массива как аргументов

Часто нужно распаковать массив в аргументы функции. До ES6 это было основным способом:

const numbers = [5, 12, 8, 130, 44];

// Без apply — не работает
const max1 = Math.max(numbers); // NaN

// С apply — преобразуем массив в аргументы
const max2 = Math.max.apply(null, numbers); // 130

// Современный способ через spread operator
const max3 = Math.max(...numbers); // 130

3. Наследование в конструкторах

В классическом наследовании apply() используется для вызова родительского конструктора:

function Animal(name, age) {
  this.name = name;
  this.age = age;
}

function Dog(name, age, breed) {
  // Вызываем конструктор Animal с контекстом текущего объекта
  Animal.apply(this, [name, age]);
  this.breed = breed;
}

const dog = new Dog("Рекс", 3, "Лабрадор");
console.log(dog.name);  // "Рекс"
console.log(dog.breed); // "Лабрадор"

4. Объединение массивов (исторический подход)

До spread оператора для объединения массивов использовали apply():

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

// Старый способ
const combined1 = [].concat.apply([], [arr1, arr2]); // [1, 2, 3, 4, 5, 6]

// Современный способ
const combined2 = [...arr1, ...arr2]; // [1, 2, 3, 4, 5, 6]

apply vs call vs bind

Эти три метода похожи, но отличаются способом передачи аргументов:

const greet = function(greeting, punctuation) {
  return `${greeting}, ${this.name}${punctuation}`;
};

const person = { name: "Иван" };

// call — передаём аргументы по одному
greet.call(person, "Привет", "!"); // "Привет, Иван!"

// apply — передаём аргументы массивом
greet.apply(person, ["Привет", "!"]); // "Привет, Иван!"

// bind — возвращает новую функцию, не вызывает её сразу
const boundGreet = greet.bind(person, "Привет");
boundGreet("!"); // "Привет, Иван!"

Практические примеры в React

// В контексте React компонента
class Logger {
  logMessage = (message) => {
    console.log(`[${this.name}]: ${message}`);
  };
}

function handleClick(event) {
  this.logMessage.apply(this, ["Клик произошёл"]);
}

// В современном React с функциональными компонентами apply
// используется реже, так как мы избегаем привязки this

Когда использовать apply() сегодня

С появлением spread оператора в ES6, apply() стал менее популярным:

// Старый способ
Math.max.apply(null, numbers);

// Новый способ (предпочтительно)
Math.max(...numbers);

Однако apply() всё ещё полезен когда:

  • Работаете с array-like объектами (arguments, NodeList)
  • Нужна совместимость со старыми браузерами
  • Передаёте аргументы программно из переменной

Вывод

apply() — это мощный инструмент для управления контекстом функции и передачи аргументов из массива. Хотя в современном JavaScript spread оператор часто применяется более естественно, понимание apply() критично для:

  • Работы с легаси кодом
  • Интервью
  • Реализации сложных паттернов типа наследования
  • Работы с library функциями, ожидающими отдельные аргументы
Для чего используется Apply? | PrepBro