为什么不阻止JavaScript?

Fil*_*tos 0 javascript

考虑这个JavaScript代码:

<script type="text/javascript">

function loop(Message){
document.getElementById('output').innerHTML = 
document.getElementById('output').innerHTML + Message + '</br>';
}

window.setInterval("loop('Message1')", 1000); //Prints "Message1" every 1 Seconds
window.setInterval("loop('Message2')", 3000); //Prints "Message2" every 3 Seconds

</script>

<body>
<div id="output"></div>
</body>

Output:
Message1
Message1
Message2
Message1
Message1
Message1
Message2
...
Run Code Online (Sandbox Code Playgroud)

现在考虑这个PHP代码:

<?php
while(true){               // Print "Message1" every 1 Second
echo 'Message 1 </br>';
sleep(1);
}



while(true){              //This Code will never be executed, 
echo 'Message 2 </br>';    //because the First Loop Blocks the Process!!!!!
sleep(3);
}

?>

Output:
Message1
Message1
Message1
Message1
Message1
Message1
...
Run Code Online (Sandbox Code Playgroud)

为什么第一个JavaScript循环不像PHP中的第一个while-Loop那样停止整个过程?

我知道Javascript是SingleThreaded,所以我想,JavaScript不能只是启动一个新线程来处理第二个循环.所以我想知道JavaScript如何阻止这里?

有人可以向我解释一下吗?

dec*_*eze 6

因为setInterval特别没有 sleep.

setInterval更像是一个调度程序.它标志着应该执行某些操作的时间,并让主线程完全忘记它,直到该时间到来.

sleep 另一方面,它基本上是一个无操作循环,它允许在循环时执行任何其他操作.

这很重要,因为PHP和Javascript的用例完全不同.PHP脚本具有开始和结束,并以线性方式执行.Javascript用于交互性,这意味着它需要以非线性方式响应各种事物(鼠标点击,键盘输入,定时器,AJAX回调).如果主线程被阻塞等待计时器,则不会发生任何事情,并且界面将显示为冻结.

这是jQuery的John Resig关于Javascript计时器的好文章:http://ejohn.org/blog/how-javascript-timers-work/