JavaScript-рекурсия с синхронизацией событий (setTimeout) - PullRequest
2 голосов
/ 02 января 2012

Я пытаюсь построить таймер с помощью JavaScript. Вот моя функция:

var t;
function time(num){
    var buf = num;
    document.getElementById("test").innerHTML=buf;
    buf++;
    alert(buf + " " + num); //For troubleshooting
    t=setTimeout("time(buf)",1000);
}

Если я выполню время (0), ничего не случится с деталью с ID = "test". num всегда равно 0, а buf всегда равно 1 (из функции оповещения) при каждом вызове функции.

Мне хорошо с Java и C, и я знаю, что это будет работать на этих языках. Я знаю, что JavaScript также является языком передачи по значению, так почему этот таймер не работает?

Кроме того, почему ничего не произошло, когда я попытался (и изменил все buf на num )

t=setTimeout("time(num)",1000);

Я знаю, что есть другие способы создания таймера, но я хочу знать, почему этот метод не работает. Спасибо.

Ответы [ 2 ]

4 голосов
/ 02 января 2012

Избегайте передачи строк на setTimeout. Когда вы делаете это, строка более или менее выполняется как eval, что является злом по многим причинам. См. этот вопрос для получения дополнительной информации.

Вместо этого рассмотрите возможность передачи анонимной функции в setTimeout. Это сделает решение вашей проблемы тривиальным:

t = setTimeout(function() { time(buf); }, 1000);
2 голосов
/ 02 января 2012

Когда вы передаете строку в setTimeout, она оценивается, когда придет время. В этом случае, когда придет время, переменная buf больше не будет, и код выдаст ошибку.

Вы должны подставить значение самостоятельно.

t = setTimeout("time(" + buf + ")",1000);

Или, что еще лучше, передайте функцию вместо строки

t = setTimeout(function() {
  time(buf);
}, 1000);
...