Каким образом передаются аргументы из 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, все хорошо
По-моему переменные не передаются в декоратор. Декоратор возвращает(подсовывает) нам свою функцию, вместо оригинальной.
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.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей