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