【JS】JavaScript引擎的内部执行机制
近期在复习JavaScript,看到setTimeout函数时。想起曾经刚学时,在一本书上看过setTimeout()里的回调函数执行的间隔时间有昌不是后面设置的值。曾经没想太多。网上看了JS大神的解释,整理记录下JavaScript引擎的内部执行机制。
首先看一段小程序:
<script>
alert('第1');
setTimeout(function(){alert('第2');}, 2000);
alert('第3');
</script>
输出顺序是:第1。第3,第2;再来看一段小程序:
<script>
alert('第1');
setTimeout(function(){alert('第2')}, 0);
alert('第3');
</script>
输出顺序还是:第1,第3,第2。为什么不是第1,第2,第3。setTimeout的间隔时间设置为0不就是马上执行吗?在此引出JavaScript的执行机制:Event
Loop(貌似译为事件轮询)。
JavaScript的任务队列
由于JavaScript是单线程的。全部的任务仅仅能是一个接一个的运行,可是当遇像IO这种读取一些大文件时就会出现后一个任务长时间处于等待状态。要等到前一个任务运行完才干開始后一个任务。
由于这样。JavaScript也设计为主线程能够先无论IO设备,先运行后面的任务,等IO设备返回了结果。再回去继续运行。
因此。在JavaScript中,全部的任务能够分为两种:一是同步任务(synchronous);二是异步任务(asynchronous)。
同步任务就是:在主线程上。必须等前一个任务运行完。才干运行后一个任务;异步任务则是:不进入主线程。而是进入“任务队列”(task
queue)的任务,主线程仅仅有在得到“任务队列”的通知。某个异步任务能够运行,该异步任务才会进入主线程运行。
事实上“任务队列”就是一个事件的队列。主线程读取“任务队列”,就是读取里面的事件。这些事件一般包含IO设备的事件、点击、滚动事件,凡是指定过回调函数(callback)。这些事件发生时就会进入“任务队列”。异步任务必须指定回调函数。主线程运行异步任务,就是运行相应的回调函数。
oText.innerText = '...';
比方在某一页面中。运行了上面这一代码后。DOM的内容会发生改变,接着系统触发DOM Changed事件,产生异步回调。回调函数被加入到“任务队列”中。
Event
Loop
1.同步任务在主线程上运行会形成一个“运行栈”(execution context stack);
2.异步任务在“任务队列”里有执行结果就会在“任务队列”里置一事件(Event)。
3.当“运行栈”中的同步任务都运行完后。“任务队列”中有运行结果(事件,比方:Mouse Clicks、Key Presses、定时事件等)的异步任务就会进入“运行栈”,開始运行;
主线程从“任务队列”读取事件的过程是不断循环的,这样的机制就称为Event Loop。
Event Loop图解:
仅仅有“运行栈”中任务运行完了,就会去读取“任务队列”,运行各事件相相应的回调函数。
如今应该明确开篇中,为什么setTimeout的间隔时间设置为0却最后运行了吧,由于要等“运行栈”中的代码运行完后,才会去运行“任务队列”中的回调函数。
Author:顾故
Sign:别输给以前的自己
【JS】JavaScript引擎的内部执行机制的更多相关文章
- Spark内部执行机制
Spark内部执行机制 1.1 内部执行流程 如下图1为分布式集群上spark应用程序的一般执行框架.主要由sparkcontext(spark上下文).cluster manager(资源管理器)和 ...
- Js之事件循环(执行机制)
js的执行机制是事件循环 什么是事件循环? js引擎在执行代码时,首先会将同步代码加入到主线程中,异步代码会放到event table中注册回调函数, 当主线程空闲之后,event table中的回调 ...
- JS: javascript 点击事件执行两次js问题 ,解决jquery绑定click事件出现点击一次执行两次问题
javascript 点击事件执行两次js问题 在JQuery中存在unbind()方法,先解绑再添加点击事件,解决方案为: $(".m-layout-setting").unbi ...
- 【THE LAST TIME】彻底吃透 JavaScript 执行机制
前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...
- 探索JavaScript执行机制
前言 不论是工作还是面试,我们可能都经常会碰到需要知道代码的执行顺序的场景,所以打算花点时间彻底搞懂JavaScript的执行机制. 如果这篇文章有帮助到你,️关注+点赞️鼓励一下作者,文章公众号首发 ...
- js 执行机制
浏览器中每个一个窗口都是一个单独的进程.这就需要分析浏览器与Javascript解释引擎之间的关系.先给出结论,浏览器本身是多线程的,Javascript解释引擎是单线程的. 先说说浏览器有哪些线程, ...
- 夯实基础上篇-图解 JavaScript 执行机制
讲基础不易,本文通过 9 个 demo.18 张 图.2.4k 文字串讲声明提升.JavaScript 编译和执行.执行上下文.调用栈的基础知识.
- javascript从定义到执行 js引擎 闭包
javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境 栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链 ...
- JS引擎的执行机制:探究EventLoop(含Macro Task和Micro Task)
在我看来理解好JS引擎的执行机制对于理解JS引擎至关重要,今天将要好好梳理下JS引擎的执行机制. 首先解释下题目中的名词:(阅读本文后你会对这些概念掌握了解) Event Loop:事件循环Micro ...
随机推荐
- Shell读取一个表达式并计算其结果
#!/bin/bash # 读取一个算数表达式并计算出结果 # 如果输入 # 5+50*3/20 + (19*2)/7 # 则结果为 # 17.929 read x printf "%.3f ...
- cf上分的失落->高兴->更失落
cf昨日做出一个题居然div2打了1800多名直接上分了...我原以为垂直落地但是....我现在1399差一分就能蓝名了啊啊啊啊,以后不一定会有这个水平的啊,给个蓝名体验卡不行吗,多加一分会死啊... ...
- linux批量检测服务器能否ping通和硬盘容量状态并抛出报警的一个脚本-附详细解释
有一些linux基础,最近刚开始学shell,参考了阿良老师的一个监测服务器硬盘状态的脚本,自己进行了一些扩展,今天比较晚了,后边会把注释放上来,感觉脚本还很不完善,希望大家一起探讨一下,共同学习 2 ...
- git服务器端安装
一.服务器端安装 git支持四种传输协议 1.本地协议 2.ssh协议 3.git协议 4.http/s协议 [root@zabbix ~]# cat /etc/redhat-release Cent ...
- luogu4035 [JSOI2008]球形空间产生器
如果单按照距离相等的话既是高次也没有半径,所以因为给了 \(n+1\) 组点就想到两两做差. 假如一组点是 \(\{a_i\}\) 一组是 \(\{b_i\}\),我们能轻易地得出 \[\sum_{i ...
- xtu summer individual 2 C - Hometask
Hometask Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Origin ...
- smartctl---查看硬件接口
1.查看磁盘信息: #smartctl -i /dev/sda smartctl 5.42 2011-10-20 r3458 [x86_64-linux-2.6.18-308.16.1.el5] (l ...
- bzoj 1503[NOI 2004] 郁闷的出纳员
题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...
- [luoguP1186] 玛丽卡(spfa)
传送门 因为要随机删除一条边,而枚举所有边肯定会超时,经过发现,先求出一遍最短路,而要删除的边肯定在最短路径上,删除其他的边对最短路没有影响. 所以可以先求出最短路,再枚举删除最短路上的每一条边再求最 ...
- android去除标题栏和状态栏(全屏)
转--http://www.eoeandroid.com/thread-66555-1-1.html 在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方 ...