随着js不断学习,你可能会慢慢的好奇,用了这么久的js,殊不知道这js在浏览器怎么被执行的,很尴尬。因此,我查阅不少资料来总结JS的执行过程,也分享出来,和你们一块儿学习。git
本篇主要讲单线程的JS
涉及的名词:JS引擎,单线程,执行栈,执行上下文(execution context)github
JS引擎是浏览器的重要组成部分,主要用于读取并执行js。就是这家伙执行js的,但它不止于执行js。浏览器
浏览器 | Js引擎 |
---|---|
Chrome | V8 |
Firefox | SpiderMonkey |
IE | Chakra(查克拉) |
Safari | Nitro/JavaScript Core |
Opera | Carakan |
虽然每一个浏览器的JS引擎都不一样,但他们执行js机制大体相同。多线程
单线程是指Js引擎执行Js时只分了一个线程给他执行,也就是执行js时是单线程的。dom
直接举个例子吧,你打开一个浏览器(应用程序),那浏览器就是一个进程。打开浏览器后要作不少事情(各类分工):发送请求,接受请求,渲染页面,执行js等等这些就是一个个线程。ide
我这里只是简单的说一下,具体的你们能够找计算机操做系统资料深刻学习。函数
这个要回到Js历史了,布兰登·艾奇(Brendan Eich)老哥用10天创造js。当时js用来干吗,简单的浏览器交互,验证,操做一下dom是吧。那把它设计成那么复杂干什么,并且若是多线程的话,操做dom会出现麻烦的事情,假设一个线程读取DOM节点数据的同时,另外一个线程把那个DOM节点删了,呵呵。因此js一个线程就够了,也就是一步一步顺序运行下来。学习
单线程只能一步步执行下来,因此执行如下代码会致使阻塞(有个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执行的细节,执行上下文。
本文出自博客园:http://www.cnblogs.com/Ry-yuan/
做者:Ry(渊源远愿)
欢迎访问个人我的首页:个人首页
欢迎访问个人github:https://github.com/Ry-yuan/demoFiles 欢迎转载,转载请标明出处,保留该字段。