arguments - это
массив массиво-подобный объект аргументов,
всегда присутствующий в функции (кроме стрелочных).
Тут используется декоратор – функция-обёртка над другой функцией.
Изначальная функция
worker.slow()
оборачивается в новую функцию-декоратор. Декоратор выполняет некую работу, вызывает оригинальную функцию, с ее результатом может выполнить еще какую-то работу, и возвращает итоговый результат.
После выполнения этой строчки
worker.slow = cachingDecorator(worker.slow, hash);
в
worker.slow
у вас уже не оригинал, а декоратор. Т.е. эта функция
function() {
let key = hash(arguments); // (*)
if (cache.has(key)) {
return cache.get(key);
}
let result = func.call(this, ...arguments); // (**)
cache.set(key, result);
return result;
};
Именно она выполняется в последней строчке. Сюда передаются аргументы 3 и 5, которые и попадают в зарезервированный массив
arguments
.
Можно переписать так, чтобы лучше понять, что происходит:
function cachingDecorator(func, hash) {
let cache = new Map();
return function(arg1, arg2) { // явно указать аргументы
let key = hash(arg1, arg2); // (*)
if (cache.has(key)) {
return cache.get(key);
}
let result = func.call(this, arg1, arg2); // (**)
cache.set(key, result);
return result;
};
}