Не пойму передачу аргументов в функцию

184
11 февраля 2018, 01:36

Каким образом передаются аргументы из sum(1, 2) в декоратор?

// вспомогательная функция для проверки на число
function checkNumber(value) {
  return typeof value == 'number';
}
// декоратор, проверяющий типы для f
// второй аргумент checks - массив с функциями для проверки
function typeCheck(f, checks) {
  return function() {
    for (var i = 0; i < arguments.length; i++) {
      if (!checks[i](arguments[i])) {
        alert( "Некорректный тип аргумента номер " + i );
        return;
      }
    }
    return f.apply(this, arguments);
  }
}
function sum(a, b) {
  return a + b;
}
// обернём декоратор для проверки
sum = typeCheck(sum, [checkNumber, checkNumber]); // оба аргумента - числа
// пользуемся функцией как обычно
alert( sum(1, 2) ); // 3, все хорошо
Answer 1

По-моему переменные не передаются в декоратор. Декоратор возвращает(подсовывает) нам свою функцию, вместо оригинальной.

  return function() {
    for (var i = 0; i < arguments.length; i++) {
      if (!checks[i](arguments[i])) {
        alert( "Некорректный тип аргумента номер " + i );
        return;
      }
    }
    return f.apply(this, arguments);
  }

Этот код выполняет наша функция со своими переменными и в конце вызывается уже оригинал. Ну и так как код получается, как бы выполняется в самой функции, то ему доступны параметры функции через объект arguments.

Хотя тут главное понять принцип, как написать этот декоратор и что к параметрам функции можно обращаться через arguments.

READ ALSO
Добавить json в data- атрибут

Добавить json в data- атрибут

Добрый вечер! Есть такая структура:

247
Возможно ли ограничение зоны поиска DOM?

Возможно ли ограничение зоны поиска DOM?

Можно ли, например, для метода getElementById, сократить область поиска со всей страницы до какой-либо отдельной части HTML-документа? В примере

186
Как на Apache с PHP 7 запустить версию PHP 5.3

Как на Apache с PHP 7 запустить версию PHP 5.3

Есть локальный сервер на Apache с PHP версии 7 но в списке сайтов есть некоторые написаные с версией 53 и из за того что некоторый функционал не работает...

208
В sonata-admin скролл там, где он не нужен

В sonata-admin скролл там, где он не нужен

На каждой странице в Sonata-admin появляется скролл, даже если страница помещается в экранПример скролла

238