Задать вопрос
@Swaer

Можно кто код объяснить?

function work(a, b) {
  alert( a + b ); 
}
function spy(func) {
  
    function wrapper(...args) {
      wrapper.calls.push(args);
      return func.apply(this, arguments);
    }
  
    wrapper.calls = [];
  
    return wrapper;
 }
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"
}


Не могу понять, что тут да как, что это work = spy(work); и как работает, что тут параметр func делает, что тут this(думаю window) и так далее, кто может построчно объяснить функцию spy и work = spy(work)
  • Вопрос задан
  • 337 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
TrueBlackBox
@TrueBlackBox
// Создать функцию 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"
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы