js执行三部曲
语法分析 // 通篇扫描,但是不编译
预编译 // 四部曲 1.创建AO对象(执行期上下文,也就是作用域)
2.找形参和变量声明,值为undefined
3.把形参和实参相统一
4.找函数里的函数声明,值赋予函数体
解释执行 // 解释一行,执行一行
预编译发现在函数执行的前一刻
注意: 全局的变量明和局部函数的变量名相同时,内部打印时访问的时内部的变量
全局的 GO 除了变量不要忘记了函数声明
GO: window === GO
var a = 123; function a(){ } . console.log( a ); // 打印出123
预编译
前奏
函数声明整体声明( 区别于函数表达式 ),变量的声明提升
暗示全局变量 imply global : 任何变量,如果未经声明描,直接赋值,那么变量归window所有。
一切声明的全局变量都是window的属性。
var a = b = 3; //此时b未经声明,所有b是全局变量,window.b可以访问
运行期上下文
运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象( AO, GO )。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行期上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文被销毁。
查找变量:从作用域链的顶端依次向下查找。
作用域定义
[[scope]] : 每个javascript 函数都是一个对象,对象中有些属性可以访问,但有些不可以,这些属性仅供javascript引擎存取,[[scope]]就是其中一个。
[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。
作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。
function a ( ) {
function b ( ) {
function c ( ) {
}
c ( ) ;
}
b ( ) ;
}
a ( );
a defined : a.[[scope]] --> 0:GO
a doing : a.[[scope]] --> 0: aAO
1: GO
b defined : b.[[scope]] --> 0: aAO
1: GO
b doing : b.[[scope]] --> 0: bAO
1: aAO
2: GO
c defined : c.[[scope]] --> 0: bAO
1: aAO
2: GO
c doing : c.[[scope]] --> 0: cAO
1: bAO
2: aAO
3: GO
网友评论