В рамках упражнения я написал простую функцию для отображения «двоичных часов», часов, которые «тикают» каждые две секунды вместо одной. Функция, которую я написал, на самом деле является модификацией аналогичного кода, который делает это в форме HTML (значение в форме изменяется снова и снова).

Вот моя модификация только для JS:

function binaryClock() {                        
    let currentTime = new Date();
    let hr = currentTime.getHours();
    let mn = currentTime.getMinutes();
    let sc = currentTime.getSeconds();

    setTimeout('binaryClock()', 2000);
    document.body.innerHTML = '';
    document.write(hr + ':' + mn + ':' + sc + ' '); 
}

binaryClock();

Почему это на самом деле работает между значениями, как любые часы в том смысле, что setTimeout действует как setInterval при обратном вызове binaryClock?

Я имею в виду, что если я использую setInterval() вместо этого, я получаю точно такой же результат, и, как новичок, у меня все еще нет достаточных знаний, чтобы объяснить, почему в этом конкретном случае setTimeout() (который обычно выполняется один раз) будет работать как setInterval() в этом случае и посчитал достаточно важным задать это здесь, поскольку я никогда не сталкивался с такой разницей в своих исследованиях.

-4
sangoko 28 Авг 2017 в 16:18

3 ответа

Лучший ответ

Благодаря deceze, который прокомментировал, я понимаю, что пропустил реализацию рекурсивности в оригинальном коде. Теперь я понимаю, что функция сама вызывает каждый раз, когда она выполняется, через вызов внутри setTimeout () или setInterval:

Он вызывается в каждом тике, в то время как только 2 секунды вступают в силу, так как функция могла бы сама себя рекурсивно в любом случае из-за способа, которым язык обычно интерпретируется.

Таким образом, поведение, подобное setInterval (), будет достигнуто из рекурсивности в любом случае.

-1
sangoko 28 Авг 2017 в 14:54

«Почему моя функция setTimeout в Javascript ведет себя как setInterval?»

Потому что ты сделал это таким образом. Вы вызываете свою функцию binaryClock() рекурсивно.

3
Stuart 28 Авг 2017 в 13:23

Это работает как setInterval, так как вы делаете setTimeout (binaryClick, 2000) для каждого тика.

Так что в основном каждый раз, когда ваши часы "тикают", они запускают следующий тик

1
idohu 28 Авг 2017 в 13:22