js底层学习—js引擎 event loop机制

1、 js引擎是单线程的还是多线程的?

          从表面看来,setTimeout()、ajax异步请求、回调函数这些js中比较重要的特性看起来是多线程的,但是js引擎却是 单线程 的。时至今日,HTML5中已经提出了web worker标准,允许js脚本去创造多个线程,但是这些线程中只有一个主线程,而且其他线程都受主线程的控制,所以,js的本质依然是单线程。但是我们都知道,单线程只能在同一时间处理一件事务,那么这一定会有效率差的问题,因为,当前事务的处理,一定会堵塞事件队列中的其他事务的执行。而某些耗时的io操作,比如键盘输入,比如ajax于是js引入了 异步 的解决方案,采用了 event loop 机制去将耗时的io操作放入事件队列(所谓 事件队列 ,就是只有前一个事件执行完毕,后一个事件才会继续执行)中去,先去执行下一个事务操作,而那些放入到队列中的耗时的io操作(比如ajax)在执行完毕之后,javascript会将异步方法的执行结果放入到事件队列中,等待执行。

         而正是因为javascript的非阻塞的io事件处理模型,node才最终选择了js,大大推动了js在服务端的发展。

2、浏览器是多线程的

     js引擎线程只是浏览器中的一个线程。通常浏览器会有三个线程:js引擎线程、GUI线程(用于渲染视图)、浏览器时间触发线程(用于用户对浏览器的控制交互)

3、js引擎采用单线程机制,这和js的诞生有关:

      js被创造出来用于实现操作浏览器html中的DOM树、CSS样式树以及实现界面中用户与html中DOM的动态交互,那么问题来了,假如js是多线程执行,那么很可能出现同一时刻有两个线程在操作同一个UI DOM元素,并且假如一个线程用于给DOM元素添加样式,而另一个线程用于删除DOM元素。这时候,这个DOM就成为了 临界资源,浏览器就无法去裁决究竟以哪一个线程的操作为准。虽然,我们也可以实现某些  锁 来规避这种线程操作互斥的情况,但是这一定会给js开发带来更大的复杂性。所以js最终采用单线程机制。

4、setTimeout()

      setTimeout()方法有两个参数,第一个参数为一个 函数,第二个参数是一个时间。

     首先看这个代码:   setTimeout(function hello(),1000);

     内部的运行顺序:在js引擎执行完该行js代码之后,会在1000毫秒之后会把hello()这个函数放入到事件队列中。等到事件队列中排在hello()之前的任务执行完毕后,hello()得到执行。所以setTimeout方法中设置的时间为1000毫秒,只是说明在setTimeout()方法运行之后的1000毫秒时,把setTimeout方法的第一个参数:hello()函数放入到事件队列中准备执行。注意,这里是准备执行,而不是立即执行。所以,在setTimeout()方法执行后,到hello()执行的  时间差 总是大于1000毫秒的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容