为什么在 input#q 上输入任何内容都会挂起整个页面?
<html>
<head></head>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="q">
<input>
<script type="text/javascript">
$("#q").keydown(function() {
while(true) {
}
});
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我期望的行为是处理该特定 keydown 事件的线程会阻塞,但页面将保持响应。我进行了测试,因为我很想知道该代码是否会阻止用户在 input#q 上输入。然而,它远不止于此:整个页面块(我在 Chrome、Firefox 和 Safari 上尝试过)。
我继续尝试这个:
setTimeout(function() {
while(true){}
}, 5000);
Run Code Online (Sandbox Code Playgroud)
5 秒后页面挂起。没有更多的交互是可能的。那不应该在不同的线程上吗?javascript 和所有其他与页面的交互是否在同一线程上运行?
javascript 是单线程的。因此,即使 setTimeout 启动计时器,回调事件也仅在 UI 线程上调用。这就是 5 秒后while(true){}永久循环挂起 UI 线程的原因。