javascript - 为什么javascript的forever循环会阻塞页面?

标签 javascript jquery

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

http://jsfiddle.net/9cw2pjym/

我期望的行为是处理该特定 keydown 事件的线程将阻塞,但页面将保持响应。我进行了测试,因为我很好奇该代码是否会阻止用户在 input#q 上键入内容。然而,它远远不止于此:整个页面被屏蔽(我在 Chrome、Firefox 和 Safari 上尝试过)。

我继续尝试这个:

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

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

最佳答案

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

关于javascript - 为什么javascript的forever循环会阻塞页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25341690/

相关文章:

javascript - 是否可以为 location.reload() 添加 JavaScript for/while 循环;

javascript - MongoDB:如何使用正则表达式重命名字段

javascript - 增加由progressbar.js创建的饼图的大小(宽度和高度)

javascript - 如何在 javascript/JQUERY 中合并两个 JSON 数据

javascript - 结合 javascript 正则表达式

javascript - 如何更改jsp <form :input/> via JavaScript with a barcode reader?的焦点

javascript - 如何获取应用该方法的上下文

JavaScript/jQuery : possible to 'automate' switch statement through for loop?

javascript - 向下滚动网页时显示多个粘性标题

jquery - 使用 C# 设置 MVC 应用程序中输入的背景颜色