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

  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 中代码的运行环境分为以下三种:

  • 全局级别的代码 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是 这个环境。

  • 函数级别的代码 当执行一个函数时,运行函数体中的代码。

  • Eval 的代码 在 Eval 函数内运行的代码。

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