由var a = 2 ;所知

134 阅读2分钟
JS本质上为一种编译语言,在传统的编译语言的流程中,程序中的一段源代码在执行之前会经历三个步骤。
1,分词/词法分析
这个过程将由字符组成的字符串分解成有意义的代码块(又称词法单元 token)。如var a = 2 ;被分解为 var、a、=、2、;5个部分,空格是否会被当作token,取决于空格是否具有意义。
2,解析/语法分析
将上述的词法单元流(数组)转化成一个由元素逐级嵌套所组成的代表了程序语法结构的树,既抽象语法树(AST)。
3,代码生成
将AST转换成可执行代码。
JS本质上与上述相同,但是略有不同。
三大概念
1,引擎
从头到尾负责整个JS程序的编译及执行过程;
2,编译器
负责词法分析和AST生成等事务。
3,作用域
负责收集并维护由所有声明的标识符组成的一系列查询,并实施一条非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

以var a = 2 ;为例
编译器会把他经过词法分析,变成token,然后将这些token解析成一个AST,但是当由AST转成可执行代码时,会有些不同。
1,遇到var a时,编译器会查询在当前作用域下是否存在变量a,存在则忽略,继续往下执行,不存在则在当前作用域的集合中新建一个变量并命名为a;
2,接下来AST继续转成可执行代码,当遇到a = 2时,编译器会先在当前作用域下查询是否有a这个变量,有的话就执行赋值操作;没有的话就沿着作用域一直往顶层找,直到找到a为止,实在找不到的话就抛出异常。
3,(1)中当前作用域 在不同的关键字下是有不同的意义的。 var时,表示顶级作用域,或者是作用域链的最底部,而let/const 则为真正的当前作用域,作用域链的最顶端。