1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > js引擎的执行机制详解

js引擎的执行机制详解

时间:2024-05-23 20:46:47

相关推荐

js引擎的执行机制详解

web前端|js教程

javascript,详解,机制

web前端-js教程

会员积分兑换商城源码,vscode做网页教程,ftp连不上ubuntu,tomcat 大小设置,sqlite查询网速慢,音乐播放插件,汽车前端框架产品有限公司,雪松树上爬虫是什么,php 和css,郑州seo搜索推广,ab网站模板怎么样,网页滚轮 左右,discuz 装修公司 模板lzw

语音在线源码,vscode怎么安装js,ubuntu 字母重叠,tomcat 调用jdk,sqlite 字符串排序,腾讯的web前端用的什么框架,从爬虫到坐牢搞笑图片,php value 排序,上海宝山seo排名,微信打开网站是乱码,php网页在线制作源码,dede 分类信息模板lzw

本文主要和大家分享js引擎的执行机制详解,希望能帮助到大家。

首先,请牢记 2 点:

js 是单线程语言

手机搭建网站的源码,UBUNTU安装师傅文案,网络爬虫代码实例,php和jap,工体seo优化lzw

js 中的 event loop 是 js 的执行机制。深入了解 js 的执行,就等于深入了解 js 里的 event loop

js 为什么是单线程的?

js 最初被设计用在浏览器中,那么想象一下,如果浏览器中的 js 是多线程的。

场景描述:

那么现在有 2 个进程,process1 process2,由于是多进程的 js,所以他们对同一个 dom,同时进行操作,process1 删除了该 dom,而 process2 编辑了该 dom,同时下达 2 个矛盾的命令,浏览器究竟该如何执行呢?

这样想,js 为什么被设计成单线程应该就容易理解了吧。

js 为什么需要异步?

场景描述;

如果 js 中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。对于用户而言,阻塞就意味着‘卡死’,这样就导致了很差的用户体验。

所以,js 中存在异步执行。

单线程又是如何实现异步的呢?

既然 JS 是单线程的,只能在一条线程上执行,又是如何实现的异步呢?

是通过的事件循环(event loop), 就理解了 js 的执行机制。

js 中的 event loop(1)

console.log(1);setTimeout(function() { console.log(2);}, 0);console.log(3);// 输出 1 3 2

也就是说,setTimeout 里的函数并没有立即执行,而是延迟了一段时间,满足一定条件后,才去执行的,这类代码,我们叫异步代码。

所以,这里我们首先知道了 JS 里的一种分类方式,就是将任务分为: 同步任务和异步任务

按这种分类方式,js 的执行机制就是:

首先判断 js 是同步的还是异步的,同步的就进入主线程,异步就进入 event table

异步任务在 event table 中注册函数,当满足触发条件后,被推入 event queue

同步任务进入主线程后一直执行,直到主线程空闲,才会去 event queue 中查看是否有可执行的异步任务,若果有就推入到主线程中。

以上三步循环执行,就是 event loop

所以上述例子,你是否可以描述他们的执行顺序了?

console.log(1); // 同步任务,放入主线程中setTimeout(function() { // 异步任务,放到event table中,0秒后被推入到event queue中 console.log(2);}, 0);console.log(3); // 同步任务,放到主线程中// 输出 1 3 2// 当1,3被打印后,主线程去event queue(事件队列)里查看是否有可执行的函数,执行setTimeout里面的函数。

js 中的 event loop(2)

再看下一个例子:

setTimeout(function() { console.log("定时器开始");}, 0);new promise(function(resolve) { console.log("马上执行for循环了");}).then(function(resolve) { console.log("执行then函数拉");});console.log("代码执行结束");

用之前总结的 js 执行机制去分析:

setTimeout 是异步任务,放在 event table中new promise是同步任务,被放到主线程中,直接打印console.log(马上执行for循环了);.then里面的是异步任务,被放到event table中console.log(代码执行结束) 是同步代码,被放在主线程中,直接执行。

所以,结果是 【马上执行 for 循环啦 — 代码执行结束 — 定时器开始啦 — 执行 then 函数啦】吗?

亲自执行后,结果居然不是这样,而是【马上执行 for 循环啦 — 代码执行结束 — 执行 then 函数啦 — 定时器开始啦】

那么,难道是异步任务的执行顺序,不是前后顺序,而是另有规定? 事实上,按照异步和同步的划分方式,并不准确

而准确的划分方式是:

macro-task(宏任务): 整体代码 script, setTimeout,setInterval

micro-task(微任务): Promise,process,nextTick

按照这种分类方式,js 的执行机制就是:

执行一个宏任务,过程中如果遇到微任务,就将其放到微任务的 event queue 中

当前宏任务执行完成后,会常看微任务的 event queue ,并将里面全部的微任务依次执行完。

重复以上 2 步骤,结合 event loop(1) event loop(2) ,就是更为准确的 JS 执行机制了。

按照刚才的机制,分析例 2:

// 首先执行script下的宏任务,遇到setTimeout,将其放在宏任务队列中setTimeout(function() { console.log("定时器开始");}, 0);// 遇到new promise直接执行new promise(function(resolve) { console.log("马上执行for循环了");}).then(function(resolve) { // .then方法,是微任务,放在微任务队列中 console.log("执行then函数拉");});console.log("代码执行结束");// 宏任务执行完毕,查看本轮的微任务,返现有一个then方法。再去执行宏任务队列中的函数。

谈谈 setTimeout

这段 setTimeout 代码什么意思? 我们一般说: 3 秒后,会执行 setTimeout 里的那个函数

setTimeout(function() { console.log("执行了");}, 3000);

但是这种说并不严谨,准确的解释是: 3 秒后,setTimeout 里的函数被会推入 event queue,而 event queue(事件队列)里的任务,只有在主线程空闲时才会执行。

所以只有满足 (1)3 秒后 (2)主线程空闲,同时满足时,才会 3 秒后执行该函数

深入理解 js 引擎的执行机制

首先,请牢记 2 点:

js 是单线程语言

js 中的 event loop 是 js 的执行机制。深入了解 js 的执行,就等于深入了解 js 里的 event loop

js 为什么是单线程的?

js 最初被设计用在浏览器中,那么想象一下,如果浏览器中的 js 是多线程的。

场景描述:

那么现在有 2 个进程,process1 process2,由于是多进程的 js,所以他们对同一个 dom,同时进行操作,process1 删除了该 dom,而 process2 编辑了该 dom,同时下达 2 个矛盾的命令,浏览器究竟该如何执行呢?

这样想,js 为什么被设计成单线程应该就容易理解了吧。

js 为什么需要异步?

场景描述;

如果 js 中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。对于用户而言,阻塞就意味着‘卡死’,这样就导致了很差的用户体验。

所以,js 中存在异步执行。

单线程又是如何实现异步的呢?

既然 JS 是单线程的,只能在一条线程上执行,又是如何实现的异步呢?

是通过的事件循环(event loop), 就理解了 js 的执行机制。

js 中的 event loop(1)

console.log(1);setTimeout(function() { console.log(2);}, 0);console.log(3);// 输出 1 3 2

也就是说,setTimeout 里的函数并没有立即执行,而是延迟了一段时间,满足一定条件后,才去执行的,这类代码,我们叫异步代码。

所以,这里我们首先知道了 JS 里的一种分类方式,就是将任务分为: 同步任务和异步任务

按这种分类方式,js 的执行机制就是:

首先判断 js 是同步的还是异步的,同步的就进入主线程,异步就进入 event table

异步任务在 event table 中注册函数,当满足触发条件后,被推入 event queue

同步任务进入主线程后一直执行,直到主线程空闲,才会去 event queue 中查看是否有可执行的异步任务,若果有就推入到主线程中。

以上三步循环执行,就是 event loop

所以上述例子,你是否可以描述他们的执行顺序了?

console.log(1); // 同步任务,放入主线程中setTimeout(function() { // 异步任务,放到event table中,0秒后被推入到event queue中 console.log(2);}, 0);console.log(3); // 同步任务,放到主线程中// 输出 1 3 2// 当1,3被打印后,主线程去event queue(事件队列)里查看是否有可执行的函数,执行setTimeout里面的函数。

js 中的 event loop(2)

再看下一个例子:

setTimeout(function() { console.log("定时器开始");}, 0);new promise(function(resolve) { console.log("马上执行for循环了");}).then(function(resolve) { console.log("执行then函数拉");});console.log("代码执行结束");

用之前总结的 js 执行机制去分析:

setTimeout 是异步任务,放在 event table中new promise是同步任务,被放到主线程中,直接打印console.log(马上执行for循环了);.then里面的是异步任务,被放到event table中console.log(代码执行结束) 是同步代码,被放在主线程中,直接执行。

所以,结果是 【马上执行 for 循环啦 — 代码执行结束 — 定时器开始啦 — 执行 then 函数啦】吗?

亲自执行后,结果居然不是这样,而是【马上执行 for 循环啦 — 代码执行结束 — 执行 then 函数啦 — 定时器开始啦】

那么,难道是异步任务的执行顺序,不是前后顺序,而是另有规定? 事实上,按照异步和同步的划分方式,并不准确

而准确的划分方式是:

macro-task(宏任务): 整体代码 script, setTimeout,setInterval

micro-task(微任务): Promise,process,nextTick

按照这种分类方式,js 的执行机制就是:

执行一个宏任务,过程中如果遇到微任务,就将其放到微任务的 event queue 中

当前宏任务执行完成后,会常看微任务的 event queue ,并将里面全部的微任务依次执行完。

重复以上 2 步骤,结合 event loop(1) event loop(2) ,就是更为准确的 JS 执行机制了。

按照刚才的机制,分析例 2:

// 首先执行script下的宏任务,遇到setTimeout,将其放在宏任务队列中setTimeout(function() { console.log("定时器开始");}, 0);// 遇到new promise直接执行new promise(function(resolve) { console.log("马上执行for循环了");}).then(function(resolve) { // .then方法,是微任务,放在微任务队列中 console.log("执行then函数拉");});console.log("代码执行结束");// 宏任务执行完毕,查看本轮的微任务,返现有一个then方法。再去执行宏任务队列中的函数。

谈谈 setTimeout

这段 setTimeout 代码什么意思? 我们一般说: 3 秒后,会执行 setTimeout 里的那个函数

setTimeout(function() { console.log("执行了");}, 3000);

但是这种说并不严谨,准确的解释是: 3 秒后,setTimeout 里的函数被会推入 event queue,而 event queue(事件队列)里的任务,只有在主线程空闲时才会执行。

所以只有满足 (1)3 秒后 (2)主线程空闲,同时满足时,才会 3 秒后执行该函数

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。