Функции декораторы

187
25 ноября 2018, 19:40

Ниже приведён общий пример декоратора.У меня такой вопрос: 2й аргумент в декораторе "MyFunc" это и есть обёртка которую возвращает декоратор?

function f(x) {} // любая функция
var timers = {}; // объект для таймеров
// отдекорировали
f = timingDecorator(f, "myFunc");
// запускаем
f(1);
f(2);
f(3); // функция работает как раньше, но время подсчитывается
alert( timers.myFunc ); // общее время выполнения всех вызовов f

реализация с измерителем времени:

var timers = {};
// прибавит время выполнения f к таймеру timers[timer]
function timingDecorator(f, timer) {
  return function() {
    var start = performance.now();
    var result = f.apply(this, arguments); // (*)
    if (!timers[timer]) timers[timer] = 0;
    timers[timer] += performance.now() - start;
    return result;
  }
}
// функция может быть произвольной, например такой:
var fibonacci = function f(n) {
  return (n > 2) ? f(n - 1) + f(n - 2) : 1;
}
// использование: завернём fibonacci в декоратор
fibonacci = timingDecorator(fibonacci, "fibo");
// неоднократные вызовы...
alert( fibonacci(10) ); // 55
alert( fibonacci(20) ); // 6765
// ...
// в любой момент можно получить общее количество времени на вызовы
alert( timers.fibo + 'мс' );
Answer 1

Декоратор возвращает новую функцию

function timingDecorator(f, timer) {
  return function() {
  ...

Второй аргумент в декораторе - это название свойства, которое создаётся декоратором в объекте timers и куда потом записывается общее время выполнения вызовов функций, которые прошли через декоратор с таким же вторым параметром.

...
if (!timers[timer]) timers[timer] = 0;
timers[timer] += performance.now() - start;
...

Чтобы это увидеть, в вашем же примере есть алерт

alert( timers.myFunc )
READ ALSO
Vuex — как в action получить доступ к mutation из модуля c приватным namespace?

Vuex — как в action получить доступ к mutation из модуля c приватным namespace?

Из модуля products пробую получить доступ к mutations из модуля cartЭтот вариант не срабатывает

166
Ошибка “picture should represent a valid URL” при расшаривании в facebook

Ошибка “picture should represent a valid URL” при расшаривании в facebook

Устанавливаю на сайт скрипт ya-share2Задал все параметры, настроил разметку openGraph

180
Открытие js из Python

Открытие js из Python

я хочу сделать приложение что оно логинелось на сайте а потом жало на кнопку, проблема в том что кнопке в html выглядит так

177
Обрезка текста по длине на чистом JavaScript без JQ

Обрезка текста по длине на чистом JavaScript без JQ

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

171