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

Что передается вторым аргументом в методе call?

1.0 Junior🔥 151 комментариев
#JavaScript Core

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

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

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

Что передается вторым аргументом в методе call?

Вторым и последующими аргументами в методе call() передаются параметры функции (аргументы, которые должны быть переданы в саму функцию). Первый аргумент - это контекст (this), остальные - аргументы функции.

Синтаксис и основная концепция

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

Тутовой:

  • thisArg - значение, которое будет использовано как this при вызове функции
  • arg1, arg2, arg3, ... - аргументы, передаваемые в функцию

Базовый пример

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

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

// Вторым аргументом передаём 'Привет'
// Третьим аргументом передаём '!'
greet.call(person, 'Привет', '!');
// Вывод: Привет, Иван!

Здесь:

  • Первый аргумент person - контекст (this)
  • Второй аргумент 'Привет' - greeting
  • Третий аргумент '!' - punctuation

Сравнение call, apply и bind

call() - аргументы передаются по одному:

function displayInfo(age, city) {
  console.log(this.name + ' ' + age + ' лет в городе ' + city);
}

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

// Аргументы передаются через запятую
displayInfo.call(user, 25, 'Москва');
// Вывод: Мария 25 лет в городе Москва

apply() - аргументы передаются массивом:

function displayInfo(age, city) {
  console.log(this.name + ' ' + age + ' лет в городе ' + city);
}

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

// Аргументы передаются как массив
displayInfo.apply(user, [25, 'Москва']);
// Вывод: Мария 25 лет в городе Москва

bind() - возвращает новую функцию:

function displayInfo(age, city) {
  console.log(this.name + ' ' + age + ' лет в городе ' + city);
}

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

// bind возвращает новую функцию
const boundFunction = displayInfo.bind(user, 25, 'Москва');
boundFunction(); // Вывод: Мария 25 лет в городе Москва

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

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

const calculator = {
  value: 10,
  multiply: function(factor) {
    return this.value * factor;
  }
};

const simpleFunction = function(multiplier) {
  return 5 * multiplier;
};

// Используем call для передачи контекста calculator
const result = calculator.multiply.call(calculator, 3);
console.log(result); // 30

Пример 2: Наследование и заимствование методов

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

Animal.prototype.speak = function(sound) {
  console.log(this.name + ' издает звук: ' + sound);
};

function Dog(name, breed) {
  // Используем call для наследования свойств Animal
  Animal.call(this, name);
  this.breed = breed;
}

const dog = new Dog('Шарик', 'овчарка');
Animal.prototype.speak.call(dog, 'Гав-гав');
// Вывод: Шарик издает звук: Гав-гав

Пример 3: Преобразование массивоподобных объектов

function findMax() {
  // arguments - это массивоподобный объект
  // Используем call для вызова Array.prototype.slice
  const argsArray = Array.prototype.slice.call(arguments);
  return Math.max(...argsArray);
}

const max = findMax(10, 20, 5, 40);
console.log(max); // 40

Пример 4: Вызов методов из разных объектов

const car = {
  brand: 'BMW',
  displayBrand: function(color, year) {
    console.log(this.brand + ' ' + color + ' ' + year + ' года');
  }
};

const anotherCar = { brand: 'Mercedes' };

// Используем метод car.displayBrand с контекстом anotherCar
car.displayBrand.call(anotherCar, 'серебристый', 2024);
// Вывод: Mercedes серебристый 2024 года

Пример 5: Функция с несколькими аргументами

function createGreeting(greeting, punctuation, extra) {
  return greeting + ', ' + this.name + punctuation + ' ' + extra;
}

const person = { name: 'Петр' };

// Передаём multiple аргументы
const message = createGreeting.call(
  person, 
  'Привет',  // arg1
  '!',       // arg2
  'Как дела?' // arg3
);

console.log(message); // Привет, Петр! Как дела?

React пример

class Component {
  constructor(name) {
    this.name = name;
  }

  handleClick(action, value) {
    console.log(this.name + ': ' + action + ' ' + value);
  }
}

const component = new Component('MyComponent');

// В обработчике события
const button = document.querySelector('button');
button.addEventListener('click', () => {
  // Используем call для правильного контекста
  component.handleClick.call(component, 'clicked', 'button1');
  // Вывод: MyComponent: clicked button1
});

Современный подход с стрелочными функциями

// Со стрелочными функциями call не нужен, так как
// они сохраняют лексический контекст
const person = {
  name: 'Алиса',
  greet: (greeting) => {
    // Здесь this будет из внешней области видимости
    console.log(greeting + ', ' + this.name);
  }
};

// Или использовать method shorthand
const person2 = {
  name: 'Боб',
  greet(greeting) {
    console.log(greeting + ', ' + this.name);
  }
};

person2.greet('Привет'); // Привет, Боб

Заключение

Вторым и последующими аргументами в методе call() передаются:

  • Параметры функции, которые нужны функции для работы
  • Могут быть любого типа: строки, числа, объекты, функции
  • Порядок аргументов важен - они соответствуют параметрам функции
  • call используется, когда нужно явно установить контекст (this) и передать аргументы

Это отличается от apply(), где аргументы передаются как массив, и от bind(), которая возвращает новую функцию.