是Javascript中在单独线程中执行的事件循环
Is the event loop in Javascript executing in a separate thread?
我仍然相信Javascript是单线程的,但是当我想到事件处理机制时,我有一些疑问。
- 事件循环是一个单独的线程,它从一个接一个地提取事件
为什么我认为这样做是即使在处理队列中的一个事件时,它也可以监听或将事件推送到同一个队列。我创建了一个示例如下:
<html>
<head>
<script>
function clicked(){
alert("clicked in between..");
}
function longRun(){
for(var i=0;i<50000;i++){
console.log(i);
}
alert("completed .... ");
}
</script>
</head>
<body>
<input type="button" value="quick!" onclick="clicked();"/>
<input type="button" value="long run!" onclick="longRun();"/>
</body>
</html>
当我点击长跑!这将需要一些时间来完成,但在此期间,如果我点击快!它将被添加到事件队列中,并将在长时间运行事件之后立即执行。
到底发生了什么?谁能解释/纠正我
除了webWorkers(我们不在这里讨论),浏览器中每个窗口只有一个"用户线程"。这意味着只有一个线程在运行你的用户Javascript。
这并不意味着浏览器引擎没有其他线程来处理非javascript处理。事实上,这种情况很有可能发生。但是,由于这些其他可能的线程,从来没有实际运行任何Javascript或影响任何Javascript变量,它们不会直接影响JS的执行环境。
是的,这些其他线程可能确实会向JS事件队列中插入一些东西,这些东西将在JS主线程准备好处理下一个事件时被拾取。
看这个答案JavaScript如何处理AJAX响应在后台?查看更多信息和相关文章列表。
每个选项卡只有一个线程。这个线程既执行JavaScript又更新屏幕。当longRun
执行时,你不能对点击按钮做出反应;您注册的事件将在所有50000次迭代完成后触发。
澄清一下:事件被放在队列中。标签线程正在按顺序执行队列。
编辑:而且,确实,有工人,但他们的行为,如果他们在不同的选项卡执行-他们有自己的上下文,只能与调用程序使用postMessage
通信。
如果你使用safari,每个浏览器都使用堆栈,所以你会在inspect元素中看到操作被放在堆栈中,所以根据你的脚本代码,首先它会完成5000次迭代的循环。
Javascript工作在单线程上。事件按照fifo顺序进行排队和处理。
我们正在做的是编写事件处理程序,它只是回调函数,将在事件从队列中处理后执行,因此它是单线程的,但本质上是异步的。
您可以从http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/
- 如何在onclick事件执行代码时在ImageButton上设置加载gif
- 如果类有多个事件处理程序方法,如何防止多个事件执行
- 单击事件执行单击和悬停事件处理程序,即使单击事件处理程序取消绑定所有处理程序也是如此
- 对多个滚动事件执行一次操作并防止滚动
- jQuery全局/本地事件执行顺序
- 作为预生成事件执行PowerShell脚本失败
- 允许对目标事件执行默认操作,并阻止对父级执行默认操作
- 使用点击jquery事件执行css3转换
- 阻止.mouseout事件执行
- 无法通过键盘事件执行功能
- 循环中的Javascript onclick事件执行了1次以上
- 如何将多个事件处理程序添加到同一个html元素中,并根据事件执行不同的方法
- 在Angular 2中处理click和clickOutside事件执行优先级的最佳方式
- 在mustache模板中对点击事件执行函数
- Java脚本函数,直到save事件执行完成
- 每个事件执行多次代码:多次下载
- 当onclick事件执行异步代码时,我如何在新选项卡请求中打开
- 在所有控制器中对同一个事件执行同一个函数——AngularJS
- Jquery事件执行两次
- 对img load事件执行html注释