← Назад к вопросам
Что передается вторым аргументом в методе 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(), которая возвращает новую функцию.