Создайте декоратор makeLogging(f, log), которая берет функцию одного аргумента f и массив log. Она возвращает обертку, которая при каждом вызове записывает («логирует») аргументы в log.
У функции f может быть только один аргумент.
Работать должно так:
function work(a) {
/* ... */ // work - произвольная функция, один аргумент
}
function makeLogging(f, log) { /* ваш код */ }
var log = [];
work = makeLogging(work, log);
work(1); // 1, добавлено в log
work(5); // 5, добавлено в log
for(var i=0; i<log.length; i++) {
alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5"
}
Решение
Решение
Возвратим декоратор wrapper который будет записывать аргумент в log и передавать вызов в f:
function work(a) {
/*...*/ // work - произвольная функция, один аргумент
}
function makeLogging(f, log) {
*!*
function wrapper(a) {
log.push(a);
return f.call(this, a);
}
*/!*
return wrapper;
}
var log = [];
work = makeLogging(work, log);
work(1); // 1
work(5); // 5
for(var i=0; i<log.length; i++) {
alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5"
}
При вызове f.call на всякий случай передадем и this, ведь функция может быть вызвана и в контексте объекта.
#56