Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.07.2008, 13:08
Аватар для Хранитель Света
Интересующийся
Отправить личное сообщение для Хранитель Света Посмотреть профиль Найти все сообщения от Хранитель Света
 
Регистрация: 11.05.2008
Сообщений: 20

Еще один вопрос по 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>
Ответить с цитированием
  #2 (permalink)  
Старый 11.07.2008, 14:12
Аватар для Snipe
Профессор
Отправить личное сообщение для Snipe Посмотреть профиль Найти все сообщения от Snipe
 
Регистрация: 06.05.2008
Сообщений: 765

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() каждую тысячную секунды

Не проверял.

Последний раз редактировалось Snipe, 11.07.2008 в 14:20.
Ответить с цитированием
  #3 (permalink)  
Старый 11.07.2008, 14:42
Аватар для Хранитель Света
Интересующийся
Отправить личное сообщение для Хранитель Света Посмотреть профиль Найти все сообщения от Хранитель Света
 
Регистрация: 11.05.2008
Сообщений: 20

А что плохого в том ч рекурсия будет бесконечной?
Ответить с цитированием
  #4 (permalink)  
Старый 11.07.2008, 14:46
Аватар для Snipe
Профессор
Отправить личное сообщение для Snipe Посмотреть профиль Найти все сообщения от Snipe
 
Регистрация: 06.05.2008
Сообщений: 765

Сообщение от Хранитель Света Посмотреть сообщение
А что плохого в том ч рекурсия будет бесконечной?
Эксперименты не ставил, но что-то мне подсказывает что и браузер может зависнуть.
Да и в принципе, зачем она, если она ничего не делает?
Просто внесите setTimout в скобки под условие if.
Ответить с цитированием
  #5 (permalink)  
Старый 11.07.2008, 21:35
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Хранитель Света
А что плохого в том ч рекурсия будет бесконечной?
Будет переполнение стека. Но т.к. здесь на самом деле нет никакой рекурсии, то в данном случае ничего плохого не будет.
Ответить с цитированием
  #6 (permalink)  
Старый 12.03.2009, 21:37
Artem Svoka
 
Сообщений: n/a

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

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

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


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень простой как даже по мне вопрос по поводу setTimeout & setInterval Хранитель Света Общие вопросы Javascript 5 12.07.2008 19:34