js执行过程(VO\GO\AO等)+闭包原理

写这篇文章主要是由用来总结和复习的,最近在看why老师的js高级,学到了很多,以下仅为个人认知有误欢迎提出。

  

所有的js执行过程以v8引擎来说明。

1.v8引擎执行过程

1.1解析生成AST

 首先v8引擎会对源代码进行语法分析、词法分析。词法分析就是将一个句子中的所有成分都抽出来,对于每个成分给与一个type和value,以键值对的方式描述。然后语法分析这些词之间的关系。例如:const name=”qq”

词法分析:tokens:[{type:keyword,value:’const’},{type:indentifier,value:’name’},等等各个成分抽开]

语法分析:分析词法分析每个{}之间的关系。

最终生成一个AST(abstract syntax code).生成一个语法树的好处很多,之前很多的es5转es6这类或者css转scss都是根据语法树就可以修改然后再转为另一种语言。

测试网站:astexplorer.net

1.2通过igition转字节码

 由于上一步生产了AST所以很容易利用这个树将代码转为字符码,再将字符码转为汇编再最后变成cpu的机器码。(由于JAVA拥有跨平台性的原因是JVM虚拟机,只需要获得字符码就可以在任意拥有java虚拟机的电脑上将字符码转为该电脑对应的机器码)这种引擎就实现了跨平,让js在任何电脑上都可以用。

1.3通过TurboFan完善加速

 如果一直按着上面的模式,来一个js转为一个字节码,然后再汇编再机器语言执行,其实会很慢。所以用TurboFan来对这个js文件中出现次数多的function标记为hot方法,为其编当前cpu的机器语言,后面遇到重复的便不用再像之前那样复杂,只需要用这个机器码就可以。

 但是也有问题,由于js不像ts有类型检测,所以sum(2,8)和sum(‘ss’,’er’)是两种不同的机器语言。这个时候就需要用到TurboFan的补充,将这个sum(‘ss’.’er’)按之前的方法生成字节码在一步一步成为机器码。

2.基础知识补充

    JS在执行的时候会先在堆中开辟一个空间来加载基础的GO对象(存放可被JS直接调用的变量和方法,比方window),接下来会对当前的JS文件进行parse,解析后会对GO对象进行补充(向里面添加变量和函数名)。当解析完后便会开始执行,对于变量创建GEC(全局执行上下文)放入上下文栈中,其中的VO指向GO;对于函数的执行创建FEC(函数执行上下文)放入上下文栈中,其中的VO指向AO。执行完后会开始进行内存清理,如果某个内存块没有被引用或者从GO通过引用箭头达不到便会被删除(具体见GC垃圾回收机制)。 

 

  介绍完最基本的原理,接下来就是对于js文件在执行时的作用域和内存分析,下面会从简单的js到复杂的js讲解,js文件的解析和执行。

3.全局代码执行过程

3.1全为全局代码执行

3.1.1JS代码

var a='wuwuwu'
var num1=3
var num2=4
var result=num1+num2
console.log(result);

3.1.2JS执行

    当JS文件被下载后,首先会在内存的堆中创建一个GO(global object)全局对象的属性是全局定义的符号,javasciprt程序可以直接使用,比如window(指向GO)、setTimeout、Date等(这些均是GO原生自带的属性)。接着便会进行解析parse,发现代码中有其他的变量定义,所以会将这些新的变量名加入到GO中作为属性名,但由于这时候还没有执行所以每个属性的value值是undefined。沿着V8引擎,下一步就是对解析后的代码进行运行执行。这里是随着代码的顺序执行,在GEC中从GO找到a,再将其从undefined变为'wuwuw',后面变量执行方式一致。  

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值