为什么javascript永远循环阻止页面?

时间:2014-08-16 16:18:19

标签: javascript jquery

为什么在输入#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>

http://jsfiddle.net/9cw2pjym/

我期望的行为是处理特定keydown事件的线程会阻塞,但页面仍将保持响应。我做了测试,因为我很想知道该代码是否会阻止用户在输入#q上输入。但是,它远不止于此:整个页面块(我在Chrome,Firefox和Safari上试过它)。

我继续尝试了这个:

setTimeout(function() {
    while(true){}
}, 5000);

页面挂起5秒后。不可能有更多的互动。不应该在不同的线程上吗? javascript和页面的所有其他交互是否在同一个线程上运行?

2 个答案:

答案 0 :(得分:4)

javascript是单线程的。因此,即使setTimeout启动计时器,也只在UI线程上调用回调事件。这就是5秒后while(true){}永久循环挂起UI线程的原因。

答案 1 :(得分:2)

基本上大多数用户界面,特别是Web浏览器都是单线程的。它们通过相当复杂的事件模型给出多线程的可见性。但它只会同时做一件事。

但是,由于HTML5不再正确,因此它支持使用WebWorkers运行多线程进行后台计算。