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