// Создать функцию work, что она делает понятно, надеюсь
function work(a, b) {
alert( a + b );
}
// Создать функцию spy, которая принимает в себя функцию
function spy(func) {
// Создать функцию-обертку, которая принимает в себя все аргументы
// функции, внутри которой она была вызвана.
function wrapper(...args) {
// Сохранить аргументы внутри wrapper.calls
wrapper.calls.push(args);
// Привязать функцию, что передавалась как агрумент,
// к контексту, в котором она будет вызвана
return func.apply(this, arguments);
}
// Вот тут начинается полный говнокод.
// То, что написано снизу, равноценно следующему:
// var wrapper;
// wrapper.calls = [];
// Почему говнокод? Потому что во первых никто
// давно в 2020 году не пользуется var. А почему?
// А потому что эта переменная будет висеть на общее обозрение.
// Никогда не надо делать так, объявляйте нормально:
// const wrapper или let wrapper. Более того, не понятно,
// зачем здесь нужен именно wrapper.calls. Можно просто создать
// переменную const wrapper = [] и пушить в неё.
wrapper.calls = [];
// Собственно вернуть то что получилось.
return wrapper;
}
// Снова говнокод. По итогу теперь work = wrapper, у которого определен
// метод func как function func(a, b) { alert(a+b) }. work что объявлен в самом начале исчез.
work = spy(work);
// Здесь вызывается то что получилось.
work(1, 2); // 3
work(4, 5); // 9
// Тут выводятся значения из массива, всё понятно
for (let args of work.calls) {
alert( 'call:' + args.join() ); // "call:1,2", "call:4,5"
}
На скорую руку, я бы это переделал так.
const argumentsArray = [];
function work(a, b) {
console.log(a + b);
}
function loggedArgs(...args) {
argumentsArray.push(args);
}
function workAndLog() {
work(...arguments);
loggedArgs(...arguments);
}
workAndLog(1, 2); // 3
workAndLog(4, 5); // 9
for (let args of argumentsArray) {
console.log("call:" + args.join()); // "call:1,2", "call:4,5"
}