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


Posted in Javascript onNovember 22, 2017

大家在学习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执行问题

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

五、小结

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

Javascript 相关文章推荐
javascript数字数组去重复项的实现代码
Dec 30 Javascript
JavaScript 用cloneNode方法克隆节点的代码
Oct 15 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
Jun 29 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
JS实现状态栏跑马灯文字效果代码
Oct 24 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
Jul 01 Javascript
js+css3实现旋转效果
Jan 20 Javascript
Angularjs的启动过程分析
Jul 18 Javascript
在Vant的基础上封装下拉日期控件的代码示例
Dec 05 Javascript
微信小程序实现批量倒计时功能
Nov 01 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
Jan 20 Javascript
原生js实现碰撞检测
Mar 12 Javascript
jquery实现回车键触发事件(实例讲解)
Nov 21 #jQuery
Angular实现双向折叠列表组件的示例代码
Nov 21 #Javascript
bootstrap表格内容过长时用省略号表示的解决方法
Nov 21 #Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
Nov 21 #Javascript
Angular4自制一个市县二级联动组件示例
Nov 21 #Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
Nov 21 #Javascript
基于bootstrap写的一点localStorage本地储存
Nov 21 #Javascript
You might like
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
JavaScript静态的动态
2006/09/18 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
python使用mysql数据库示例代码
2017/05/21 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
golang/python实现归并排序实例代码
2020/08/30 Python
复古服装:RetroStage
2019/05/10 全球购物
设计模式的基本要素是什么
2014/04/21 面试题
会计求职自荐信
2014/06/20 职场文书
就业协议书
2014/09/12 职场文书
2014年租房协议书范本
2014/10/30 职场文书
大学生自荐材料范文
2014/12/30 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang