当前位置:首页 > 日记 > 正文

详细分析单线程JS执行问题

详细分析单线程JS执行问题

大家在学习javascript的时候很多朋友在执行问题上有疑惑,小编通过本篇文章给大家详细的分析介绍了JS的执行问题,希望能够帮助到你理解。

一、介绍

随着js不断学习,你可能会慢慢的好奇,用了这么久的js,却不知道这js在浏览器怎么被执行的,很尴尬。所以,我查阅很多资料来总结JS的执行过程,也分享出来,和大家一起学习。

本篇主要讲单线程的JS
涉及的名词:JS引擎,单线程,执行栈,执行上下文(execution context)

二、JS引擎

JS引擎是浏览器的重要组成部分,主要用于读取并执行js。就是这家伙执行js的,但它不止于执行js。

各大浏览器的JS引擎:

浏览器

Js引擎

Chrome V8 Firefox SpiderMonkey IE Chakra(查克拉) Safari Nitro/JavaScript Core Opera Carakan

虽然每个浏览器的JS引擎都不同,但他们执行js机制大致相同。

三、JS执行是单线程

单线程是指Js引擎执行Js时只分了一个线程给他执行,也就是执行js时是单线程的。

a.先了解线程 有人可能会疑惑,线程是什么?

直接举个例子吧,你打开一个浏览器(应用程序),那浏览器就是一个进程。打开浏览器后要做很多事情(各种分工):发送请求,接受请求,渲染页面,执行js等等这些就是一个个线程。

我这里只是简单的说一下,具体的大家可以找计算机操作系统资料深入学习。

b.为什么是单线程 有可能有疑惑,为什么js执行要单线程,如果多线程不是可以执行得快一点吗?

这个要回到Js历史了,布兰登·艾奇(Brendan Eich)老哥用10天创造js。当时js用来干嘛,简单的浏览器交互,验证,操作一下dom是吧。那把它设计成那么复杂干什么,而且如果多线程的话,操作dom会出现麻烦的事情,假设一个线程读取DOM节点数据的同时,另一个线程把那个DOM节点删了,呵呵。所以js一个线程就够了,也就是一步一步顺序运行下来。

c.证明一下单线程

单线程只能一步步执行下来,所以执行以下代码会导致阻塞(有个while死循环),不会弹出hello

while(1){}alert('hello');

四、执行栈

实现js执行时的单线程,js引擎维护一个执行栈。(先进后出)

来个例子:运行这段代码是执行栈是怎么做的。

//运行代码sayHello();function sayHello(){var message = getMessage();console.log(message);}function getMessage(){return 'hello';}

执行栈代码模拟

//执行栈var exeStack = [];//先压如全局执行环境exeStack.push('globalContext');//遇到执行sayHello函数,ok,压进去exeStack.push('sayHello');//执行sayHello函数发现,还有个getMessage函数,ok,压进栈exeStack.push('getMessage');//执行完了getMessage函数,弹栈exeStack.pop();//继续执行sayHello函数,又发现有console.log这个家伙,ok,你进栈exeStack.push('console.log');//执行了console后,输出hello,console 弹栈exeStack.pop();//这时sayHello执行完,弹栈exeStack.pop();//最后整个代码执行完,全局环境弹栈exeStack.pop();

执行栈图示:

这里主要是js在执行时的一个总体过程,但是你们可能会疑惑,压进栈里面的一块块(抽象)东西到底包含的是什么?
我可以告诉你们是,执行上下文,global是指全局的的执行上下文,其他的是函数执行上下文,那到底这些上下文包含什么,我会在下一篇详解。

五、小结

这篇主要是将js单线程是什么,并且怎么实现单线程的,先有个总体js执行过程的印象,下一篇会详细写js执行的细节,执行上下文。

相关文章

ps怎么做北极光效果? ps给添加北极

ps怎么做北极光效果? ps给添加北极

教程,北极光,效果,怎么做,电脑软件,ps想要设计激光,该怎么设计呢?下面我们就来看看详细的教程,请看下文详介绍。软件名称:Adobe photoshop 7.01 官方正式简体中文版软件大小:154MB更新时间:2013-04-191、首先打开我们的天空素材,新建一个空白图层,…

canvas压缩转换成base64格式输出文

canvas压缩转换成base64格式输出文

格式输出,文件流,压缩,转换成,电脑软件,昨天研究了一下canvas压缩图片的方法,上传上来给大家分享一下<!--调用canvas方法--> <canvas id="canvas"></canvas> <!--压缩后的图片路劲--> <img src="" class="preview"> <img src="" cla…

AI基础教程:教你绘制四个清新风格

AI基础教程:教你绘制四个清新风格

图标,绘制,教你,基础教程,夏日,效果图:12 3 4 5 6 7 阅读全文1 23 4 5 6 7 阅读全文1 2 34 5 6 7 阅读全文1 2 3 45 6 7 阅读全文1 2 3 4 56 7 阅读全文1 2 3 4 5 67 阅读全文教程结束,以上就是AI基础教程:教你绘制四个清新风格的夏日…

详解a++和++a的区别

详解a++和++a的区别

详解,区别,电脑软件,以前我也是老搞不懂a++和++a的区别, 后来看了很多资料, 终于总结出来一条规律, 小白专用!看完这个例子就懂了:例1:$a = 8, 求 ++a + a++ - --a + a-- + ++a得多少?旧值: 8 9 10 9…

asp.net core MVC 过滤器之ActionF

asp.net core MVC 过滤器之ActionF

过滤器,电脑软件,net,asp,core,本系类将会讲解asp.net core MVC中的内置过滤器的使用,将分为以下章节asp.net core MVC 过滤器之ExceptionFilter过滤器(一)asp.net core MVC 过滤器之ActionFilter过滤器(二)asp.net core MVC 过滤器之ResultFilt…

fireworks切片功能使用方法图解

fireworks切片功能使用方法图解

切片,使用方法,功能,电脑软件,fireworks,网页三剑客之一的fireworks,小编教大家简单的切片功能,对于新手来说,可以参考本文,希望能对大家有所帮助!方法/步骤1、首先肯定是打开Fireworks,当然如果没有装的话可以先从百度下载然后安装下。2、然后点…

jQuery+ajax实现修改密码验证功能

jQuery+ajax实现修改密码验证功能

修改密码,验证,详解,实例,功能,废话不多说了,直接给大家贴代码了,具体代码如下所示:<script type="text/JavaScript"> //获取url中的参数 $(function(){ var userName = window.location.href; var aa = userName.indexOf("="); …

2013版ppt怎么使用放大镜功能

2013版ppt怎么使用放大镜功能

功能,技巧,电脑软件,ppt,  ppt中有很多强大的功能,例如放大镜功能,我们可以通过此功能对图片的某部分或内容进行放大,那么,你知道怎样使用放大镜功能吗?下面就让小编告诉你 ppt2013怎样使用放大镜功能的方法,不懂的朋友会请多多学习哦。ppt201…

JS动态生成年份和月份实例代码

JS动态生成年份和月份实例代码

实例代码,动态生成,年份,电脑软件,JS,先看下js动态生成的年份,具体代码如下所示:function makeYear() { var year = document.getElementById("year"); var my = new Date(); var endYear = my.getFullYear();// 获取当前年份 for …

详解PHP字符串替换str_replace |

详解PHP字符串替换str_replace |

函数,字符串替换,四种,详解,电脑软件,下面通过本文给大家分享PHP字符串替换str_replace()函数4种用法,具体内容如下所示:mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )该函数返回一个字符串或者…

Asp.net MVC 对所有用户输入的字符

Asp.net MVC 对所有用户输入的字符

字段,字符串,用户,输入,方法,经常需要对用户输入的数据在插入数据库或者判断之前做Trim处理,针对每个ViewModel的字段各自做处理是我们一般的想法。最近调查发现其实也可以一次性实现的。MVC4.6中实现方式1,实现IModelBinder接口,创建自定义M…

详谈for循环里面的break和continue

详谈for循环里面的break和continue

语句,循环,电脑软件,continue,break,break语句哇,我已经找到我要的答案了,我不需要进行更多的循环了!比如,寻找第一个能被5整除的数:for循环中,如果遇见了break语句,这个for循环就会立即终止,不在进行其他的迭代了。for(var i = 1 ; i <= 100; i++)…