meltmestnt
@meltmestnt
У верблюда два горба, потому что жизнь - борьба

Почему метод объекта нужно вызывать через call или apply?

Почему мы не можем вызвать метод другого объекта с массивом как аргумент : Math.max(arr); // arr = [0,1,2,...]?
Так тоже не сработает : Math.max(null, arr);
Однако вот так все хорошо : Math.max.apply(null, arr);
Объясните пожалуйста все 3 пункта : почему два первых из них не срабатывают, а 3 сработал?
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Потому, что Math.max принимает не массив, а список аргументов. А apply первым аргументом принимает контекст this, а вторым массив, который будет передан аргументами в Math.max
т.е. вот такой вызов
Math.max.apply(null, [1,2,3])
будет преобразован в
Math.max(1,2,3)
Если например аналогичный метод call, он вторым аргументом уже не принимает массив, ему нужно передавать аргументы последовательно
Math.max.call(null, 1, 2, 3);
// будет
Math.max(1,2,3)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
mbelskiy
@mbelskiy
Software Developer
Для того чтобы находить ответы на такие вопросы самостоятельно, учитесь изучать документацию.
Math.max на вход ожидает перечисление аргументов типа Number, поэтому первые два не работают.
В свою очередь, apply вызывает функцию с указанными параметрами, где второй параметр ожидается как массив, а к вызываемой функции передается как перечисление или arguments.
Ответ написан
Комментировать
@afanasiyz
Javascript-разработчик
Причем, надо понимать, что это решение - костыль, пусть и общепризнанный.
apply нужен для другого, для установки контекста, а использовать функцию не для того, для чего ее добавили в язык - не всегда правильно имхо.
А вот так, с помощью ES6 - очевиднее
Math.max(...[1,2,3])
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы