@Rapen

Почему передачу arguments делают через apply?

Допустим имеется функция:
function f(a,b) { return a+b};
Делаем вложенную функцию, в которой запускаем f. В которую передаем аргументы через функцию f2;
function f2() { 
return f(arguments)
};
f2(3,5); // "[object Arguments]5"

Вместо ожидаемого ответа, мы получем toString, объекта arguments;
А при использовании apply, вызывая f, f.apply(null, arguments); Он каким-то чудом вместо вызова toString, передает нормальные аргументы из f2.
Почему так происходит?
  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 3
romy4
@romy4
Exception handler
> Почему передачу arguments делают через apply?
чтобы поменять контекст для this

f(a,b) ожидает, а передаёте f(arguments) — это по-вашему правильно?
f получает (arguments, null) -> return arguments+null;
что будет?
Ответ написан
@vshvydky
function a() {
    console.log('aguments это: ', typeof arguments);
    b(arguments[0], arguments[1]);
    b.apply(null, arguments);
    return arguments;
}

function b(x,y) {
    if(x)console.log('определен X: ', x);
    if(y)console.log('определен Y: ', y);
    console.log('Типо обработка функции: ', x, y);
}

console.log(a(1,2,3,4,5));
Ответ написан
AppFA
@AppFA
Frontend developer at Yandex
Можно воспользоваться новым синтаксисом а именно: "spread operator" и сделать как-то так:
https://jsfiddle.net/d5fo8913/1/
Т.к. вы передаете в f arguments а это массив, то и f будет ожидать только 1 аргумент. С спред оператором вы передадите все аргументы по отдельности
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы