Тут все просто:
...
function delay(func, timeOut) {
// при вызове delay(func, timeOut) мы создаем анонимную функцию и возвращаем ее
// но при этом внутри нее мы обращаемся к переданному параметру func
// создавая тем самым замыкание на него
return function() {
// внутри возвращаемой анонимной функции мы запускаем таймер
// которому передаем параметр func являющейся функцией, определенной
// где то вовне этот таймер выполнит func но при этом внутри самой func
// уже будет не видны параметры переданные для анонимной функции.
// Внутри анонимной функции эти параметры можно получить через arguments.
// Тля того, чтобы func могла получить к ним доступ, мы используем apply,
// привязывая к func контент вызова анонимной функции и ее arguments
// тем самым создавая замыкания к this и arguments анонимной функции
setTimeout(func.apply(this, arguments), timeOut);
// как правильно подсказал @bingo347, эту строчку надо немного переписать
setTimeout(func.bind(this, ...arguments), timeOut);
}
}
// примерно того же эффекта можно было добиться следующим кодом
function delay(func, timeOut) {
return function(text) {
setTimeout(()=>func(text), timeOut);
}
}
// можно даже добиться не примерно такого, а точно такого же эффекта
// (за исключением привязки контекста анонимной функции через this
// который влияет лишь на возможность обратится непосредственно
// к методам и свойствам самой анонимной функции, которых в вашем
// примере не объявлено )))
function delay(func, timeOut) {
return function(...args) {
setTimeout(()=>func(...args), timeOut);
}
}
...
по теме:
argumentsapply
PS: но ваш способ с учетом поправок от
Дмитрий Беляев (как и мой второй способ) правильнее, потому что позволяет не переписывая функцию delay делать так:
function f(argument1, argument2) {
alert(argument1 + " " + argument2);
}
let f1000 = delay(f, 1000);
f1000("1111", "2222"); // показывает "1111 2222" после 1000 мс
и так:
function f(argument1, argument2, argument3) {
alert(argument1 + " " + argument2 + " " + argument3);
}
let f1000 = delay(f, 1000);
f1000("1111", "2222", "3333"); // показывает "1111 2222 3333" после 1000 мс
и так далее ))))