当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 详细分析单线程JS执行问题

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

2017年12月08日  | 移动技术网IT编程  | 我要评论
大家在学习javascript的时候很多朋友在执行问题上有疑惑,小编通过本篇文章给大家详细的分析介绍了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执行的细节,执行上下文。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网