Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поведение массивов во вложенных функциях (https://javascript.ru/forum/misc/84883-povedenie-massivov-vo-vlozhennykh-funkciyakh.html)

Bonky 25.01.2023 17:41

Поведение массивов во вложенных функциях
 
Решаю задачи вот этой главы учебника javascript.ru. Нужно сделать обертку-шпион вокруг другой функции, которая будет сохранять параметры вызова в массив.

Мое решение не работает с массивом, выбрасывает ошибку TypeError: undefined is not an object (evaluating 'wrapper.base.push'). При этом если я обращаюсь ко wrapper.base как к обычной переменной, например вместо
Код:

wrapper.base.push(args);
пишу
Код:

wrapper.base = args;
, то данные сохраняются и ошибки нет. Правда, при последующих вызовых данные перезаписываются, так что такое решение не работает.

Вот мой вариант:
function work(a, b) {
        return a + b;
    }

    function spy(func) {

        return function wrapper(...args) {
            wrapper.base.push(args);
            return func.apply(this, args);
        }

        wrapper.base = [];
    }

    work = spy(work);


А решение с сайта работает, привожу его ниже. В этом решении работа происходит с массивом, и разница состоит в том, что у меня функция wrapper объявлена в виде
Код:

return function wrapper(...args)
, а в варианте из учебника функция сначала вызывается, а затем отдельно возвращается в конце.

function spy(func) {

  function wrapper(...args) {
    // мы используем ...args вместо arguments для хранения "реального" массива в wrapper.calls
    wrapper.calls.push(args);
    return func.apply(this, args);
  }

  wrapper.calls = [];

  return wrapper;
}



Мой вопрос:
Почему мой вариант решения работает с обычной переменной, но выбрасывает ошибку при попытке работы с массивом. Имеет ли к этому отношение то, как я объявляю функцию wrapper, и если да, то какая между этим всем связь?

рони 25.01.2023 17:56

Цитата:

Сообщение от Bonky
Вот мой вариант:

после return неважно, что вы напишите далее!

Bonky 25.01.2023 18:02

Цитата:

Сообщение от рони (Сообщение 550272)
после return неважно, что вы напишите далее!

Почувствовал себя идиотом :D Но ради таких моментов и пишу на этот форум.
Спасибо вам за ответ!


Часовой пояс GMT +3, время: 17:23.