Изучаю javascript. Есть код
function delay(f, time){
//alert(arguments);
for(vs of arguments){
alert(vs);
}
return function(){
setTimeout(() => {
f.apply(this, arguments);
}, time);
}
}
function f(x) {
alert( x );
}
var f1000 = delay(f, 1000);
var f1500 = delay(f, 1500);
f1000("тест"); // выведет "тест" через 1000 миллисекунд
f1500("тест2"); // выведет "тест2" через 1500 миллисекунд
Не могу понять как аргументы функции f (в данном случае аргумент x, который принимает значения "тест" и "тест2") передаются в функцию delay и функция delay получает к ним доступ... Ведь arguments в функции delay содержат именно аргументы функции delay! А мы как по волшебству в функции delay получаем доступ к аргументам другой функции (в данном случае - к аргументам другой функции f).
Сделал перебор массива arguments, там как и ожидалось в первом элементе
function f(x) {
alert( x );
}
во втором задержка 1000 или 1500
Как нам удается пробросить параметр x функции f в f.apply(this, arguments) не пониаю...
Тут главное - не использовать слово "пробросить".
Коллекции arguments в функции delay и в возвращаемой анонимной функции - это совершенно разные коллекции.
...
return function(){
setTimeout(() => {
f.apply(this, arguments);
}, time);
}
}
Экземпляры этой возвращаемой анонимной функции присваиваются переменным f1000 и f1500.
Для f1000 - значение time равно 1000.
Для f1500 - значение time равно 1500.
f в обоих случаях - внешняя функция f - первый параметр в вызовах delay.
У стрелочной функции, которая является первым параметром setTimeout, своих arguments нет, она использует arguments той функции, внутри которой она определена, то есть f1000 или f1500.
А аргументы этих f1000 и f1500 - "тест" и "тест2" соответственно.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости