考虑这个 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
...
现在考虑这个 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
...
为什么第一个 JavaScript 循环不像 PHP 中的第一个 while 循环那样停止整个进程?
我知道 Javascript 是单线程的,所以我想 JavaScript 不能仅仅启动一个新线程来处理第二个循环。所以我很想知道 JavaScript 为何不会在这里阻塞?
谁能给我解释一下吗?
最佳答案
因为 setInterval
特别不是 sleep
。
setInterval
更像是一个调度程序。它标记了应该执行某些操作的时间,并让主线程完全忘记它,直到该时间到达。
sleep
基本上是一个无操作循环,它在循环时不允许执行任何其他操作。
这很重要,因为 PHP 和 Javascript 的用例完全不同。 PHP 脚本有开始和结束,并且以线性方式执行。 Javascript 用于交互,这意味着它需要以非线性方式响应各种事件(鼠标点击、键盘输入、计时器、AJAX 回调)。如果主线程被阻塞等待计时器,则不会发生任何事情,并且界面将显示为卡住。
这是 jQuery 的 John Resig 撰写的一篇关于 Javascript 计时器的好文章:http://ejohn.org/blog/how-javascript-timers-work/
关于javascript - 为什么 JavaScript 不会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7012115/