代码分类(位置)
-
全局代码
-
函数(局部)代码
全局执行上下文
-
在执行全局代码之前将window确定为全局执行上下文
-
对全局数据进行预处理
-
var定义的全局变量==>undefined,添加为window的属性。
-
function声明的全局函数==>赋值(fun),添加为window的方法。
-
this==>赋值(window)。
-
-
开始执行全局代码
函数执行上下文
-
在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象
-
对局部数据进行预处理
-
形参变量==>赋值(实参)==>添加为执行上下文的属性(虚拟的,存在于栈中)。
-
arguments(伪数组)==>赋值(实参列表),添加为执行上下文的属性。
-
var定义的局部变量==>undefined,添加为执行上下文的属性。
-
function声明的函数==>赋值(fun),添加为执行上下文的方法。
-
this==>赋值(调用函数的对象)。
-
-
开始执行函数体代码
执行上下文栈 (特点:后进先出)
-
在全局代码执行前,js引擎就会创建一个栈俩存储管理所有的执行上下文 对象。
-
在全局执行上下文(window)确定之后,将其添加到栈中(压栈)。
-
在函数执行上下文创建后,将其添加到栈中(压栈)。
-
在当前函数执行完毕后,将栈里的对象移除(出栈)。
-
当所有的代码执行完后,栈中只剩下widow。
-
全局执行上下文只有一个。
-
栈的底部永远都是window。