Означает ли такое поведение setInterval многопоточность в Javascript?

При использовании javascript я заметил эту вещь. Вы можете использовать

var i=0; 
var startingTime=new Date().getTime();
setInterval("foo()",1);
function foo() {
    i+=1;
    if ($("#foodiv").text()==i) {
        //we detected a doubled value (parallel execution)
        $("#repdiv").append("[repetition on "+i+"]");
    }
    $("#foodiv").html(i);
    $("#timediv").html(Math.floor((new Date().getTime()-startingTime)/1000));
}

, но пока я читаю и пробую себя, время не 1 мс, а как минимум 10 мс или что-то в этом роде. Фактически, через 10 секунд у меня будет значение i около 2300/2400, а не 10000, как ожидалось.

Это минимально возможный временной фактор для процедуры ??? конечно НЕТ. Если я попробую это:

<html><head>
<script language="javascript" type="text/javascript" src="jquery-1.4.min.js"></script>
<script type="text/javascript">

var i=0;
var startingTime=new Date().getTime();

setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);

function foo() {
    i+=1;
    if ($("#foodiv").text()==i) {
        //we detected a doubled value (parallel execution)
        $("#repdiv").append("[repetition on "+i+"]");
    }
    $("#foodiv").html(i);
    $("#timediv").html(Math.floor((new Date().getTime()-startingTime)/1000));

}
</script>
</head>
<body>
<div id="foodiv"></div>  (counter)
<br/>
<div id="timediv"></div> (seconds passed)
<br/>
<div id="repdiv"></div>
<br/>
</body>
</html>

Счетчик будет работать очень быстро, и через 10 секунд у меня будет значение 12000 !!!!. Для меня это необъяснимо, потому что вызов не выполняется параллельно (или, по крайней мере, мы могли бы иметь несколько удвоенных считанных значений i для разных вызовов, фигурирующих в div repdiv).

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

Я прочитал все ваши ответы и другие квесты на форуме, и они подтвердили мои мысли. Но настоящий вопрос: почему! Почему они устанавливают ограничение на 15 мс, когда я могу выполнять несколько последовательных вызовов, получая время намного меньше? Я уверен, что эта система множественного обратного вызова не является хорошей практикой, но я могу это сделать и потенциально могу превысить загрузку процессора.

5
задан mizar 27 October 2010 в 22:24
поделиться