Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Еще один вопрос по setTimeout setInterval (https://javascript.ru/forum/misc/1401-eshhe-odin-vopros-po-settimeout-setinterval.html)

Хранитель Света 11.07.2008 13:08

Еще один вопрос по setTimeout setInterval
 
Какое действие выполняется когда эти методы добалены внутрь функции и выполняют отсрочку или повторение этой же функции. Например,создал функцию,работает правильно но не пойму как происходит SetTimeout(И еще был бы благодарен если бы обэъяснили что будет происходить если добавить вместо setTimeout - setInterval


<html>
<head>
<script>
var n=0;
function move() {
if(n<45)
{
n++;
document.getElementById('div1').style.left=index() ;
}
setTimeout(move,1);
}
function index() {
return n + "%";
}
</script>
</head>
<body onLoad='move()'>
<div id="div1" style="position:absolute;width:120px;height:120px; background:red;top:0%;">Div
</div>

</body>
</html>

Snipe 11.07.2008 14:12

var n=0;
function move() {
if(n<45)
{
n++; //увеличиваем n на 1
document.getElementById('div1').style.left=index() ; //приравниваем .left значению, которое возвращает нам index()
}
setTimeout(move,1); //через 1 тысячную секунды запускаем move(), только уже с большим n
}
function index() {
return n + "%";
}

Что могу сказать, рекурсия никогда не закончится, потому что в условие n<45 не внесено setTimeout(move,1);

Если делать через setInterval, то рекурсия не нужна.
На вскидку так:
var n = 0;
var interval;
function index() {
return n + "%";
}
function move() {
n++; //увеличиваем n на 1
document.getElementById('div1').style.left=index() ; //приравниваем .left значению, которое возвращает нам index()
if (n>=45) clearInterval(interval); //если n>=45 отключаем setInterval
}
interval = setInterval(move, 1); //Ставим запуск move() каждую тысячную секунды

Не проверял.

Хранитель Света 11.07.2008 14:42

А что плохого в том ч рекурсия будет бесконечной?

Snipe 11.07.2008 14:46

Цитата:

Сообщение от Хранитель Света (Сообщение 3562)
А что плохого в том ч рекурсия будет бесконечной?

Эксперименты не ставил, но что-то мне подсказывает что и браузер может зависнуть.
Да и в принципе, зачем она, если она ничего не делает?
Просто внесите setTimout в скобки под условие if.

Kolyaj 11.07.2008 21:35

Цитата:

Сообщение от Хранитель Света
А что плохого в том ч рекурсия будет бесконечной?

Будет переполнение стека. Но т.к. здесь на самом деле нет никакой рекурсии, то в данном случае ничего плохого не будет.

Artem Svoka 12.03.2009 21:37

>Просто внесите setTimout в скобки под условие if.

Это нужно сделать обязательно.
Как показали испытания, IE7, Opera, Firefox (самый последний на данный момент) виснут и выдают ошибку.

Пришел сюда из поисковиков, не вчитывался, скопировал код сверху, а потом убил час на то, чтобы понять почему не работает нигде больше кроме Хрома и Сафари (у них движок на яве написан).


Часовой пояс GMT +3, время: 00:57.