 
      
    JavaScript
- 5 ответов
- 0 вопросов
    0
    Вклад в тег
    
      
      
    
  
  
 
  
  // Создать функцию 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"
}