homobulla / javascript-book

读书笔记
0 stars 0 forks source link

预编译与执行代码 #3

Open homobulla opened 6 years ago

homobulla commented 6 years ago

一段源代码在执行前会经过下面三个步骤:

  1. 分词/词法分析(Tokenizing/Lexing)
  2. 解析/语法分析(Parsing)
  3. 代码生成

JavaScript执行代码会更加复杂,首先js引擎会对代码优化,代码会在执行之前进行编译。 下面我们以var a = 1;来描述一下整个过程; 首先,编译器会将其拆成词法单元,进而解析成树结构等;具体来说就是: 编译过程中,解析器会将 var a = 1 分拆成 var aa = 1 两句来执行; var a编译器会查找当前作用域是否存在 a,如果存在则忽略,否则会在当前作用域声明一个变量 a;接下来由引擎执行 a = 1,同样会首先在当前作用域内超找是否存在一个为 a 的变量,如果有则使用这个变量,也就是说把 1 赋值给它,倘若没有则继续向外层作用域超找,以此类推;若最终未找到,则报错;

函数作用域:

首先明白一个概念-> 执行期上下文,这个概念就是指代码的运行环境,也可以理解为作用域。 Javascript中代码的运行环境分为以下三种:

一个函数,在其执行的前一刻,也就是预编译过程会经过以下四步: 1:创建执行期上下文(AO对象====Activation Object), 2:为AO对象添加属性(形参和已经申明的变量),并且其值为undefind, 3:统一实参值和形参, 4:找函数申明(不包括表达式赋值var a=function(){}),并且赋值.