// Функция, умножающая на 2
function double (num) {
return num * 2;
}
// Декоратор
function decorator (func) {
return function (x) {
if(isNaN(x)) {
throw new TypeError('Ошибка! Не число.');
}
return func(x);
};
}
double = decorator(double);
console.log(double(5));
function decorator (double(num)) {
return function (x) {
if(isNaN(x)) {
throw new TypeError('Ошибка! Не число.');
}
return func(x);
};
}
// Вот так работает
double = decorator(double);
console.log(double(5)); // 10
// А вот так нет
console.log(decorator(double(5))); // [Function (anonymous)]
1. Каким образом аргумент функции double() передаётся в аргумент функции, которую возвращает декоратор?
double()
в которую и передаёт аргумент, с которым её вызвали. 2. Почему не работает прямой вызов функции-декоратора? decorator(double(5))
в таком варианте аргументом в decorator()
попадает что? — не сама функция double
, а результат её выполнения с аргументом 5
.(fn2( fn1 ))(arg)
// fn2 получает аргументом функцию fn1
// возвращает новую функцию, и уже та выполняется
// с аргументом arg
fn2( fn1( arg ))
// fn1 выполняется с аргументом arg
// результат попадает аргументом в fn2
// возвращается результат вызова fn2
function double(num) {
return num * 2;
}
function decorator(innerFn) {
return function (num) {
if(isNaN(num)) {
throw new TypeError('Ошибка! Не число.');
}
return innerFn(num);
};
}
const decoratedDouble = decorator(double);
alert(decoratedDouble(5));
decorator(double(5))
1. Каким образом аргумент функции double передаётся в аргумент функции, которую возвращает декоратор?
const decoratedDouble = decorator(double);
// decoratedDouble это функция, которая принимает аргумент х, проверяет его на соответствие типу 'number'
// и выполняет на нем инструкции, описанные функцией double
// тело функции выглядело бы так:
function decoratedDouble(x) {
if (isNaN(x)) {
throw new TypeError(...);
}
return x * 2
}
2. Почему не работает прямой вызов функции-декоратора?
decorator(double) // Function
decorator(double)(5) // 10
decorator(double)('Hello World') // TypeError
// Вот так работает
const decoratedDouble = decorator(double);
console.log(decoratedDouble(5)); // 10
// decoratedDouble это уже другая функция. та, что возвращается из декоратора.
// Просто вы ее перезаписываете в уже существующую переменную.
// А вот так нет
console.log(decorator(double(5))); // [Function (anonymous)]
console.log(
decorator(double)(5) // декоратор возвращает функцию, которую надо вызвать
); // 10