一.先编译后执行
1.编译阶段:对变量和函数进行变量提升操作
2.执行阶段:将代码一行一行的执行
javaScript在编译之后,会分为两个部分:执行上下文和可执行代码,执行上下文分为:全局执行上下文,函数执行上下文,eval 执行上下文;
执行上下文包含变量环境,词法环境(当然还包括this等等),那么变量环境和词法环境都是用来存放什么的呢?
变量环境用来存放:变量提升的部分(var)
词法环境用来存放:块级作用域未提升的部分(let,const)
二.调用栈
我们知道了在执行之前会进行变量提升,变量存放在了执行上下文,也就是变量环境和词法环境中,下一步就是按顺序执行,按什么顺序呢,就是栈的顺序(先进后出)
注:
1.在执行的时候,才会按照上面所说规则进行入栈
2.浏览器遇到javaScript标签,首先会生成全局的执行上下文,将全局变量放在全局的执行上下文的环境变量中,然后再按照函数的调用顺序一次入栈
三.编译
1.分词:首先编译器会将我们的代码,分解成有意义的代码块,我们将这一个个代码块叫做词法单元
2.解析:再将这些词法单元,解析成抽象语法树(AST)
3.代码生成:将AST转化为可执行代码的过程
三.词法作用域
javaScript采用的是词法作用域,也就是静态作用域,(也就是在编译阶段,就已经确定好了使用哪个变量(发生在分词阶段))。
代码会按照作用域链寻找,知道找到已经变量的值,这里自然就用到了遮蔽,也就是内部的标识符遮蔽了外部的标识符。
参考文档:JavaScript执行机制一 - 掘金