javascript - 为什么 JavaScript 不会阻塞?

标签 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
...

现在考虑这个 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/

相关文章:

javascript - 为 CommonJS 模块 (Typescript) 导出附加接口(interface)

javascript - 如何在 CSV 下表示 JSON 对象

javascript - 如何创建 create-react-app vendor 包

javascript - 当标记位于 Google map V3 的 View 之外时,InfoWindow 无法正确打开并包含链接

javascript - 操纵背景颜色

javascript - 在 Jade JS 中创建嵌套的 <p> 标签而不尾随换行符

javascript - 使用 jQuery 显示隐藏图像

javascript - Angular REST 数据未在 View 中正确显示

javascript - 根据窗口宽度动态更改 jQuery slider 选项

javascript - 使链接在点击时动态激活