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