JavaScript执行单线程的JS是怎么一回事儿?

2018-02-1121:26:20WEB前端开发Comments3,067 views字数 1609阅读模式

本篇主要讲单线程的JS
涉及的名词:JS引擎,单线程,执行栈,执行上下文(execution context)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

二、JS引擎

JS引擎是浏览器的重要组成部分,主要用于读取并执行js。就是这家伙执行js的,但它不止于执行js。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

各大浏览器的JS引擎:

浏览器Js引擎
ChromeV8
FirefoxSpiderMonkey
IEChakra(查克拉)
SafariNitro/JavaScript Core
OperaCarakan

虽然每个浏览器的JS引擎都不同,但他们执行js机制大致相同。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

三、JS执行是单线程

单线程是指Js引擎执行Js时只分了一个线程给他执行,也就是执行js时是单线程的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

先通俗的了解线程

  • 有人可能会疑惑,线程是什么?

我直接举个直观点例子吧,你打开一个浏览器(应用程序),那浏览器就是一个进程。打开浏览器后要做很多事情(各种分工):发送请求,接受请求,渲染页面,执行js等等这些就是一个个线程。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

我这里只是简单的说一下,具体的大家可以找计算机操作系统资料深入学习。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

Js为什么是单线程

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

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

证明一下js执行是单线程

单线程只能一个个排着队执行,所以执行以下代码会导致阻塞(有个while死循环),不会弹出hello文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

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

四、执行栈

为了实现js执行时的单线程,js引擎维护着一个执行栈。(先进后出)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

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

//运行代码
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();

执行栈图示:

JavaScript执行单线程的JS是怎么一回事儿?

这里主要是js在执行时的一个总体过程,但是你们可能会疑惑,压进栈里面的一块块(抽象)东西到底包含的是什么?
我可以告诉你们是,执行上下文,global是指全局的的执行上下文,其他的是函数执行上下文,那到底这些上下文包含什么,我会在下一篇写。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

五、小结

这篇主要是将js单线程是什么,并且怎么实现单线程的。有个总体js执行过程的印象,接下来会讲解更多里面的东西。就像是挖掘机一样,深挖下去。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

作者:前端猿Ry
链接:https://juejin.im/post/5a7bf0acf265da4e9449a4b1
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/978.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/gcs/978.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定