В качестве наркомании пишу функцию:
function userFadeout2(el, delay, opacity) {
delay = typeof delay !== 'undefined' ? delay : 50;
if(el.style.opacity == "") {
el.style.opacity = 1;
opacity = el.style.opacity;
}
else if(typeof opacity !== 'undefined') {
el.style.opacity = opacity;
}
else {
opacity = el.style.opacity;
}
if(opacity == 0) {
el.style.display = 'none';
console.log('конец');
return true;
}
else {
setTimeout(function() {
opacity -= 0.1;
console.log(opacity);
return userFadeout2(el,delay,opacity.toFixed(1));
},delay);
}
}
Первая реализацияfunction userFadeout(el, delay) {
if(el.style.opacity == "") {
el.style.opacity = 1;
}
if(el.style.opacity == 0) {
el.style.display = 'none';
return true;
}
else if((el.style.opacity -= 0.1) == 0) {
el.style.display = 'none';
console.log('конец');
return true;
}
else {
if(typeof delay != 'undefined' || delay == '') {
setTimeout(userFadeout, delay, el, delay);
}
else {
console.log(el.style.opacity);
setTimeout(userFadeout, 50, el);
}
}
}
Кучу промежуточных и производных реализация публиковать пожалуй не буду... Логика, я надеюсь и так понятна.
Проблема в том, что функция возвращает 'undefined' при первом же вызове, после чего не возвращает больше ничего, хотя после выполнения и завершения в консоль пишется 'конец'.
Эксперимент показывает, что если убрать setTimeout, то функция возвращает true и завершается там где и задумывается (после проверки на opacity == 0), в последней итерации.
Прогуглив никакого решения не нашёл, суть проблемы казалось бы понял, но потом понял, что ничего не понял. Не совсем понятно происходит ли вообще рекурсия (судя по всему нет), или просто вызывается "новая" функция, а "старая" завершается. В таком случае не понятно почему все остальные функции не возвращают ничего...
Кто может подсказать, в чём глубинная ошибка и непонимание? Или с setTimeout рекурсия вообще не возможна? И в какую сторону вообще смотреть и что читать?
Консоль-логи функцииundefined
0.9
0.8
0.7000000000000001
0.6
0.5
0.4
0.30000000000000004
0.19999999999999998
0.1
0
конец