Показать сообщение отдельно
  #1 (permalink)  
Старый 25.01.2023, 17:41
Аватар для Bonky
Новичок на форуме
Отправить личное сообщение для Bonky Посмотреть профиль Найти все сообщения от Bonky
 
Регистрация: 13.01.2023
Сообщений: 6

Поведение массивов во вложенных функциях
Решаю задачи вот этой главы учебника 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, и если да, то какая между этим всем связь?
Ответить с цитированием