很多朋友对javascript的实现有疑问。边肖通过本文给大家详细分析了JS的实现,希望能帮助大家理解。
一.导言
随着对js的不断学习,你可能会慢慢好奇,用了这么久的js却不知道它在浏览器中是如何执行的,这是很尴尬的。所以我查阅了很多资料来总结JS的实现过程,也分享给大家学习。
本文主要讨论单线程JS涉及的名词:JS引擎、单线程、执行栈和执行上下文
第二,JS引擎
Js引擎是浏览器的重要组成部分,主要用于读取和执行JS。执行js的就是这个人,但不仅仅是执行js。
主要浏览器的JS引擎:
浏览器
Js引擎
Chrome V8火狐蜘蛛猴ie chakra(查克拉)safari nitro/JavaScript核心歌剧carakan
虽然每个浏览器的js引擎不同,但是它们的JS机制大致相同。
第三,JS执行是单线程的
单线程是指当js引擎执行Js时,只分配一个线程给他执行,也就是说,当Js执行时,是单线程的。
A.先了解线程。有些人可能想知道什么是线。
例如,如果您打开一个浏览器(应用程序),浏览器就是一个进程。打开浏览器后,有很多事情要做(各种分工):发送请求、接受请求、渲染页面、执行js等等。
我只想在这里做一个简短的陈述。你可以寻找计算机操作系统的数据进行进一步的研究。
B.可能有人会怀疑为什么是单线程,为什么js要用单线程执行,如果是多线程,能不能执行的更快?
是时候回到Js历史了。布兰登艾希兄弟在10天内创造了js。当时js是做什么用的,简单的浏览器交互,验证,dom操作?为什么设计的这么复杂?如果你是多线程的,操作dom会有麻烦。假设一个线程读取DOM节点数据,另一个线程同时删除那个DOM节点,呵呵。所以js一个线程就够了,就是一步一步往下跑。
C.证明单线程
单个线程只能一步一步地执行,所以执行下面的代码会导致阻塞(有一段时间无休止的循环),不会弹出hello
while(1){ } alert(' hello ');第四,执行栈
js引擎维护一个执行栈,以便在js执行期间实现一个线程。(先进后出)
让我们举一个例子:运行这段代码是堆栈的工作方式。
//运行代码sayHello();函数sayHello(){ var message=Getmessage();console.log(消息);}函数getMessage(){返回' hello ';}执行堆栈代码模拟
//执行堆栈var exeStack=[];//先按全局执行环境exestack . push(' global context ');//满足执行sayHello功能,确定后,按exestack . push(' sayHello ');//执行sayHello函数发现还有一个getMessage函数,确定,推栈exestack . push(' getMessage ');//执行getMessage函数后,弹出栈exestack . pop();//继续执行sayHello函数,找到这个家伙console.log,好的,你推exestack . push(' console . log ');//执行控制台后,输出hello,控制台弹出exestack . pop();//这时,sayHello结束,弹出exestack . pop();//最后,整个代码执行完毕后,全局环境弹出exestack . pop();执行堆栈图标:
这主要是js执行的一个整体过程,但是您可能会想,推入堆栈的片段(抽象)到底包含什么?我能告诉你的是,执行上下文,全局指的是全局执行上下文,另一个是函数执行上下文,所以这些上下文包含的内容将在下一篇文章中详细说明。
动词(verb的缩写)摘要
本文主要讲述什么是js单线程以及如何实现。首先,我们对整个js执行过程有一个印象。接下来,我们将详细编写js执行的细节和上下文。