Javascript引擎线程


Javascript引擎 ,也可以称为JS内核,主要负责处理Javascript脚本程序,例如V8引擎。Javascript引擎线程理所当然是负责解析Javascript脚本,运行代码。

Javascript是单线程的

Javascript是单线程的, 那么为什么Javascript要是单线程的?

这是因为Javascript这门脚本语言诞生的使命所致:JavaScript为处理页面中用户的交互,以及操作DOM树、CSS样式树来给用户呈现一份动态而丰富的交互体验和服务器逻辑的交互处理。如果JavaScript是多线程的方式来操作这些UI DOM,则可能出现UI操作的冲突; 如果Javascript是多线程的话,在多线程的交互下,处于UI中的DOM节点就可能成为一个临界资源,假设存在两个线程同时操作一个DOM,一个负责修改一个负责删除,那么这个时候就需要浏览器来裁决如何生效哪个线程的执行结果。当然我们可以通过锁来解决上面的问题。但为了避免因为引入了锁而带来更大的复杂性,Javascript在最初就选择了单线程执行。

GUI 渲染线程 与 JavaScript引擎线程互斥!

由于JavaScript是可操纵DOM的,如果在修改这些元素属性同时渲染界面(即JavaScript线程和UI线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了。因此为了防止渲染出现不可预期的结果,浏览器设置GUI渲染线程与JavaScript引擎为互斥的关系,当JavaScript引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到引擎线程空闲时立即被执行。

JS阻塞页面加载

从上面我们可以推理出,由于GUI渲染线程与JavaScript执行线程是互斥的关系,当浏览器在执行JavaScript程序的时候,GUI渲染线程会被保存在一个队列中,直到JS程序执行完成,才会接着执行。因此如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

定时触发器线程

浏览器定时计数器并不是由JavaScript引擎计数的, 因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确, 因此通过单独线程来计时并触发定时是更为合理的方案。

事件触发线程

当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可以是当前执行的代码块如定时任务、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。

异步http请求线程

在XMLHttpRequest在连接后是通过浏览器新开一个线程请求, 将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件放到 JavaScript引擎的处理队列中等待处理。

推荐阅读更多精彩内容

  • JSX是随着Facebook提出react而衍生出的概念; 在Facebook之前,HTML、JavaScript...
    ITxiansheng阅读 2,155评论 0 6
  • 今天看到这篇文章,学到了不少东西 特此发出来 和大家分享JavaScript的setTimeout与setInte...
    天上的牛_有人吹阅读 104评论 0 0
  • Web前端技术由html、css和 javascript 三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低...
    WEB攻程狮阅读 1,726评论 2 116
  • vue项目搭建 vue项目快速搭建工具——vue-cli vue-cli是基于node环境的一个命令行工具。也就是...
    Qihang阅读 344评论 0 1
  • 阴山飞雪纛旗漫,长堑横关虎骑拦, 塞外金戈烽火染,关中鼓瑟殿前欢。 云中千载多纷乱,胡马南挥几度安? 国盛何须修界...
    诗酒慰年华的夏川阅读 171评论 4 6
  • 太阳如耍小性子的姑娘 躲在云层背面 却迟迟不肯露脸 细雨绵绵 与和风温柔地拥抱 细腻地缠绵 晨雾缭绕 似舍不得 如...
    烂笔头0769阅读 200评论 0 1
  • 从《致青春》到《左耳》,从《港囧》到《夏洛》,再到《我的少女时代》,近两年青春片泛滥,评论家稀饭,只留下一句初恋不...
    君英阅读 141评论 0 1