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

Что такое оператор call?

2.2 Middle🔥 171 комментариев
#JavaScript Core

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Оператор call в JavaScript

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

Основная цель и синтаксис

Метод call используется, когда необходимо:

  • Изменить значение this внутри функции
  • Вызвать функцию немедленно с заданным контекстом
  • Передать аргументы в функцию в виде списка

Синтаксис:

func.call(thisArg, arg1, arg2, ...)
  • thisArg — значение, которое будет использоваться как this при вызове функции
  • arg1, arg2, ... — аргументы, передаваемые в функцию

Практическое применение и примеры

Пример 1: Изменение контекста выполнения

const person1 = {
  name: 'Алексей',
  greet: function() {
    console.log(`Привет, меня зовут ${this.name}`);
  }
};

const person2 = {
  name: 'Мария'
};

// Обычный вызов
person1.greet(); // "Привет, меня зовут Алексей"

// Использование call для изменения контекста
person1.greet.call(person2); // "Привет, меня зовут Мария"

Пример 2: Заимствование методов

const car = {
  brand: 'Toyota',
  getInfo: function(year, color) {
    return `${this.brand} ${year} года, цвет: ${color}`;
  }
};

const bike = {
  brand: 'Yamaha'
};

// Заимствуем метод car.getInfo для объекта bike
const result = car.getInfo.call(bike, 2022, 'красный');
console.log(result); // "Yamaha 2022 года, цвет: красный"

Отличия от apply и bind

  • call vs apply: Оба метода выполняют функцию с заданным контекстом, но различаются способом передачи аргументов:

    // call принимает аргументы списком
    func.call(context, arg1, arg2, arg3);
    
    // apply принимает аргументы в виде массива
    func.apply(context, [arg1, arg2, arg3]);
    
  • call vs bind: call немедленно вызывает функцию, в то время как bind создаёт новую функцию с привязанным контекстом, которую можно вызвать позже:

    // call - немедленный вызов
    func.call(context, arg1, arg2);
    
    // bind - создание новой функции
    const boundFunc = func.bind(context, arg1, arg2);
    boundFunc(); // Вызов позже
    

Современные альтернативы

С появлением стрелочных функций в ES6, которые не имеют собственного this (захватывают его из окружающего контекста), необходимость в call несколько уменьшилась. Однако для работы с унаследованным кодом, конструкторами, и в случаях, где требуется явный контроль над контекстом, call остаётся важным инструментом.

Пример с современным синтаксисом:

// Использование call с конструкторами
function Car(brand) {
  this.brand = brand;
}

function Bike(brand, type) {
  Car.call(this, brand); // Наследование свойств
  this.type = type;
}

const myBike = new Bike('Honda', 'спортивный');
console.log(myBike.brand); // "Honda"

Важные особенности

  1. Первый аргумент может быть null или undefined: В строгом режиме ('use strict') this будет равно переданному значению, в нестрогом — будет заменено на глобальный объект
  2. Примитивы преобразуются в объекты: Если передать примитив в качестве thisArg, он будет преобразован в объект
  3. Производительность: В большинстве современных JavaScript-движков оптимизация методов call и apply сравнима с обычными вызовами функций

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