Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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, и если да, то какая между этим всем связь?
Ответить с цитированием
  #2 (permalink)  
Старый 25.01.2023, 17:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Сообщение от Bonky
Вот мой вариант:
после return неважно, что вы напишите далее!
Ответить с цитированием
  #3 (permalink)  
Старый 25.01.2023, 18:02
Аватар для Bonky
Новичок на форуме
Отправить личное сообщение для Bonky Посмотреть профиль Найти все сообщения от Bonky
 
Регистрация: 13.01.2023
Сообщений: 6

Сообщение от рони Посмотреть сообщение
после return неважно, что вы напишите далее!
Почувствовал себя идиотом Но ради таких моментов и пишу на этот форум.
Спасибо вам за ответ!
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странно поведение массивов promises js mystica Общие вопросы Javascript 1 19.11.2018 00:22
Перебор вложенных массивов объектов Epitough Общие вопросы Javascript 16 18.11.2018 19:39
Разумное поведение при изменении размера _0_ Элементы интерфейса 2 12.04.2015 23:10
Поведение массивов при копировании. FoxTrix Общие вопросы Javascript 16 25.09.2014 19:36
Пересечение и разность двух массивов harold Общие вопросы Javascript 9 18.12.2013 21:41