详细分析单线程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 相关文章推荐
倒记时60刷新网页的js代码
Feb 18 Javascript
Backbone.js的一些使用技巧
Jul 01 Javascript
利用JavaScript脚本实现滚屏效果的方法
Jul 07 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
Aug 08 Javascript
AngularJS的ng Http Request与response格式转换方法
Nov 07 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
May 22 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
Apr 28 Javascript
JS实现点击按钮可实现编辑功能
Jul 03 Javascript
vue微信分享到朋友圈 vue微信发送给好友
Nov 28 Javascript
vue mvvm数据响应实现
Nov 11 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
php使用GeoIP库实例
2014/06/27 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
js实现简单模态框实例
2018/11/16 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
[05:24]TI9采访——教练
2019/08/24 DOTA
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
python实现横向拼接图片
2020/03/23 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
企业门卫岗位职责
2013/12/12 职场文书
中学生寄语大全
2014/04/03 职场文书
学校周年庆活动方案
2014/08/22 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python