近期在复习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引擎的内部执行机制的更多相关文章

  1. Spark内部执行机制

    Spark内部执行机制 1.1 内部执行流程 如下图1为分布式集群上spark应用程序的一般执行框架.主要由sparkcontext(spark上下文).cluster manager(资源管理器)和 ...

  2. Js之事件循环(执行机制)

    js的执行机制是事件循环 什么是事件循环? js引擎在执行代码时,首先会将同步代码加入到主线程中,异步代码会放到event table中注册回调函数, 当主线程空闲之后,event table中的回调 ...

  3. JS: javascript 点击事件执行两次js问题 ,解决jquery绑定click事件出现点击一次执行两次问题

    javascript 点击事件执行两次js问题 在JQuery中存在unbind()方法,先解绑再添加点击事件,解决方案为: $(".m-layout-setting").unbi ...

  4. 【THE LAST TIME】彻底吃透 JavaScript 执行机制

    前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...

  5. 探索JavaScript执行机制

    前言 不论是工作还是面试,我们可能都经常会碰到需要知道代码的执行顺序的场景,所以打算花点时间彻底搞懂JavaScript的执行机制. 如果这篇文章有帮助到你,️关注+点赞️鼓励一下作者,文章公众号首发 ...

  6. js 执行机制

    浏览器中每个一个窗口都是一个单独的进程.这就需要分析浏览器与Javascript解释引擎之间的关系.先给出结论,浏览器本身是多线程的,Javascript解释引擎是单线程的. 先说说浏览器有哪些线程, ...

  7. 夯实基础上篇-图解 JavaScript 执行机制

    讲基础不易,本文通过 9 个 demo.18 张 图.2.4k 文字串讲声明提升.JavaScript 编译和执行.执行上下文.调用栈的基础知识.

  8. javascript从定义到执行 js引擎 闭包

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境 栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链 ...

  9. JS引擎的执行机制:探究EventLoop(含Macro Task和Micro Task)

    在我看来理解好JS引擎的执行机制对于理解JS引擎至关重要,今天将要好好梳理下JS引擎的执行机制. 首先解释下题目中的名词:(阅读本文后你会对这些概念掌握了解) Event Loop:事件循环Micro ...

随机推荐

  1. ios 自定义delegate(一)

    在自定义协议的头文件 .h中 @protocol NSDelegate <NSObject>@optional  //可选 - (void)OnOption:(NSString *)pSt ...

  2. 217. Contains Duplicate@python

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  3. ps---打开文件及图片保存格式

    1.打开图片,可以按Ctrl或者Shift来进行多张图片的选择或者用鼠标框选. 2.勾选图像序列,可以选择命名上有次序的多个图像. 3. PSD是ps里面的标准保存格式,包含颜色.图层.通道.路径.动 ...

  4. Nginx配置ThinkPHP和Laravel虚拟主机

    ThinkPHP server { listen 443 ssl; server_name abc.com; root /var/www/abc; ssl on; ssl_certificate /e ...

  5. python基础知识01-数据类型和序列类型

    %,取余 //,取整,向下取整,5//2 = 2. 一.变量类型 1.变量名不能以数字开头,不能纯数字,不要用汉字,可以用下划线开头 2.数值类型(int,float,bool,complex) ​ ...

  6. xtu summer individual 4 C - Dancing Lessons

    Dancing Lessons Time Limit: 5000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...

  7. You Are the One (区间DP)

    The TV shows such as You Are the One has been very popular. In order to meet the need of boys who ar ...

  8. C#中为什么不能再方法里定义静态变量(Static)

    c#的静态变量是在对象生成的时候分配内存空间的,而不是函数执行的时候. 如果在函数里定义,那么这个变量就需要在函数执行的时候分配内存空间,这是C#不允许的,至于为什么不允许,个是因为垃圾回收机制的问题 ...

  9. CodeForces 610B-Vika and Squares,有坑点,不是很难~~

    B. Vika and Squares time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  10. 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...