evgeniy8705
@evgeniy8705
Повелитель вселенной

Декораторы JS. Как понять решение задачи?

Повторяется история с замыканиями. Дошел до темы декораторы. В ходе чтения понял что вообше не понимаю что происходит. Прочитал тему. Перешел к задачам, и тут точно выяснилось что я ничего не понял.

С замыканиями я хоть понимал для чего они нужны, а декораторы...сути не доганяю.

В общем там есть решение задачи:

function work(a, b) {
  alert( a + b ); // work - произвольная функция
}

function makeLogging(f, log) {

  function wrapper() {
      log.push([].slice.call(arguments));
      return f.apply(this, arguments);
    }

  return wrapper;
}

var log = [];
work = makeLogging(work, log);

work(1, 2); // 3
work(4, 5); // 9

for (var i = 0; i < log.length; i++) {
  var args = log[i]; // массив из аргументов i-го вызова
  alert( 'Лог:' + args.join() ); // "Лог:1,2", "Лог:4,5"
}


Вот как работает этот декоратор?
function makeLogging(f, log) {

  function wrapper() {
      log.push([].slice.call(arguments));
      return f.apply(this, arguments);
    }

  return wrapper;
}


Особенно не понятна строка : log.push([].slice.call(arguments));

Пожалуйста помогите разобраться, что к чему и как быть с этими декораторами.
  • Вопрос задан
  • 3284 просмотра
Пригласить эксперта
Ответы на вопрос 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Особенно не понятна строка : log.push([].slice.call(arguments));
У вас, судя по вопросу, не с декораторами проблема, а со знанием основ js. Вы понимаете, что означает вызов call? Вы понимаете, что arguments - это не массив?

Мой вам совет - разберитесь с методами call и apply (без всякой привязки к дизайн-паттернам) и вам все станет ясно.
Ответ написан
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
По поводу непонятной строки:
//Превращаем псевдомассив аргументов в массив и кладем его в log
 log.push([].slice.call(arguments));

Вот как работает этот декоратор?

В задаче это говорится-записывает аргументы в log, потом вызывает f, передавая их ей
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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