详细分析单线程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 相关文章推荐
JS加ASP二级域名转向的代码
May 17 Javascript
javascript的trim,ltrim,rtrim自定义函数
Sep 21 Javascript
JavaScript 放大镜 移动镜片效果代码
May 09 Javascript
一个简单的js树形菜单
Dec 09 Javascript
Jquery阻止事件冒泡 event.stopPropagation
Dec 11 Javascript
Flash图片上传组件 swfupload使用指南
Mar 14 Javascript
JS实现生成会变大变小的圆环实例
Aug 05 Javascript
JavaScript+canvas实现七色板效果实例
Feb 18 Javascript
angularjs 源码解析之injector
Aug 22 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
vue实现的仿淘宝购物车功能详解
Jan 27 Javascript
用vite搭建vue3应用的实现方法
Feb 22 Vue.js
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网站地图生成类示例
2014/01/13 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
Ubuntu下安装PyV8
2016/03/13 Python
Python实现读取并保存文件的类
2017/05/11 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
Mybatis是这样防止sql注入的
2021/12/06 Java/Android
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏