// Функция, умножающая на 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