一段源代码在执行前会经过下面三个步骤:
- 分词/词法分析(Tokenizing/Lexing)
- 解析/语法分析(Parsing)
- 代码生成
JavaScript 执行代码会更加复杂,首先 js 引擎会对代码优化,代码会在执行之前进行编
译。下面我们以var a = 1;
来描述一下整个过程;首先,编译器会将其拆成词法单元,进
而解析成树结构等;具体来说就是:编译过程中,解析器会将 var a = 1
分拆成
var a
和 a = 1
两句来执行; var a
编译器会查找当前作用域是否存在 a
,如果存
在则忽略,否则会在当前作用域声明一个变量 a
;接下来由引擎执行 a = 1
,同样会首先
在当前作用域内超找是否存在一个为 a
的变量,如果有则使用这个变量,也就是说把 1
赋值给它,倘若没有则继续向外层作用域超找,以此类推;若最终未找到,则报错;
函数作用域:
首先明白一个概念-> 执行期上下文,这个概念就是指代码的运行环境,也可以理解为作用 域。 Javascript 中代码的运行环境分为以下三种:
-
全局级别的代码 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是 这个环境。
-
函数级别的代码 当执行一个函数时,运行函数体中的代码。
-
Eval 的代码 在 Eval 函数内运行的代码。
一个函数,在其执行的前一刻,也就是预编译过程会经过以下四步: 1:创建执行期上下文
(AO对象====Activation Object
), 2:为 AO 对象添加属性(形参和已经申明的变量),并
且其值为undefind
, 3:统一实参值和形参, 4:找函数申明(不包括表达式赋
值var a=function(){}
),并且赋值.