作用域分为全局作用域跟函数作用域
作用域内部原理分为五部分:
1.编译
2.执行
3.查询
4.嵌套
5.异常
一 编译:
编译的过程中先分词,再就行解析,最后代码生成。
分词: var a = 2; 分为var,a,=,2,;就是每个字符都要分一下
解析:把分完词之后的字符解析成一个语法树(AST)
代码生成:解析完之后,将解析完的这个语法树转换为可执行代码的一个过程叫做代码生成。就是将解析完成之后的分词转换为一组机器能读懂的指令
执行环境相当于作用域链一样
在js中,除了全局作用域,每个函数都会创建自己的作用域
作用域在函数定义时就已经创建好了,与函数调用无关
通过作用域,可查找作用域内的变量和函数有哪些,却不能知道变量的值,所有作用域是静态的
对于函数来说,执行环境在函数调用时确定的,执行环境包含作用域内的所有的变量和函数的值。
在同一个作用域下,不同的调用会产生不同的执行环境,从而产生不同的变量和值,所以执行环境是动态的
词法作用域
词法作用域就是定义在词法阶段的作用域。换句话说就是变量和块作用域在哪词法作用域就在哪
什么是词法阶段
JS语言在引擎上执行之前会经历三个步骤,这三个步骤分别是分词(也就是词法分析也就是所说的词法阶段),然后是解析,最后是代码生成。词法阶段的过程就是将由字符组成的字符串分解成一个一个的代码块,也被称作词法单元,比如var a = 2; var是一个代码块,a是一个代码块,等于号也是一个代码块,2也是一个代码块,分号也是一个代码块。这个由组成再分解的阶段叫做词法阶段。
然后什么是解析呢,就是将字符串转换成一个由元素逐级嵌套的程序语法树,也叫做抽象语法树用术语就是AST。
最后代码生成就是将这个AST也就是这个程序语法树转换为可执行代码的这个过程叫做代码生成,简单来说就是将AST转换为一组机器指令。