singlepost

JS – проблема с рекурсией и settimeout << На главную или назад  

Кажется, у меня проблема в коде.
Сам-то он работает, но функция sinchange моментально меняет прозрачность, не смотря на setTimeout. Проще говоря, она моментально рекурсивно выполняется где-то 20 раз и потому срабатывает за мгновение, не смотря на таймер. В чем дело? Я даже 1000 миллисекунд поставил таймер – все равно.

См. код:

function setOpacity(elem, value) {
elem.style.opacity = value;
elem.style.filter = 'alpha(opacity=' + value*100 + ')';
return value;
}

function SinChange(elem,x, endx,func,sp,stx)
{
var r = endx-stx;
var d = setOpacity(elem, x+sp*Math.cos(1.57*(x-stx)/r));
alert(d);
if (d<endx)
{
setTimeout(function(arg1,arg2,arg3,arg4,agr5,arg6){SinChange(arg1,arg2,arg3,arg4,agr5,arg6)}(elem,d,endx,func,sp,stx), 1000)
}
}
SetOpacity – эта функция меняет прозрачность, SinChange – Функция, в которой сама проблема.
Да, и вызывается он тут же после загрузки страницы.

2 ответов в теме “JS – проблема с рекурсией и settimeout”

  1. 2
    Александр Курганов ответил:

    спасибо огромное, сейчас попробую.
    Да и норм что я ее запускаю сразу после загрузки страницы? а то мне еще говорили что проблема может быть в этом.

  2. 1
    Денис Лисов ответил:

    Замените
    setTimeout(function(arg1,arg2,arg3,arg4,agr5,arg6){SinChange(arg1,arg2,arg3,arg4,agr5,arg6)}(elem,d,endx,func,sp,stx), 1000)
    на
    setTimeout(function(){SinChange(elem,d,endx,func,sp,stx)},1000)

    Причина – у вас рекурсивный вызов происходит в момент установки таймера. Строчка function(arg1,arg2,arg3,arg4,agr5,arg6){SinChange(arg1,arg2,arg3,arg4,agr5,arg6)}(elem,d,endx,func,sp,stx) не только определяет функцию, но и сразу же вызывает ее.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.