函数提升与变量提升:
通过 var 声明的变量,在定义的语句之前就可以访问到,其值是 undefined 通过 function 声明的函数,在其前面就可以调用,值是函数的定义
执行上下文
- 代码分类(位置):全局代码、局部代码(函数块内代码)
- 全局执行下下文
— 在执行全局代码前将 window 确定为全局执行上下文
— 对全局数据进行预处理:
—- var 定义的全局变量赋值为 undefined,添加为 window 对象属性;function 声明的函数赋值并添加为 window 对象的方法
—- 将 this 赋值为 window
—- 开始执行全局上下文
- 函数执行上下文
— 在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象(一个虚拟的存于栈中的)
— 对局部数据进行预处理
将形参变量赋值为实参并添加为执行上下文的属性
将 arguments 赋值为实参列表并添加为执行上下文的属性
var 定义的局部变量赋值为 undefined 并添加为执行上下文属性
function 声明的函数赋值并添加为执行上下文的属性
将 this 赋值为调用该函数的对象
— 开始执行上下文
- 执行上下文栈
— 在全局代码执行前, JS 引擎就会创建一个栈来存储并管理所有的执行上下文对象
— 在全局执行上下文对象 window 确定后,将其添加到栈中(压栈)
— 在函数执行上下文确定后将其压入栈中
— 在当前函数执行完后将栈顶的对象移除(出栈)
— 当所有代码执行完后,栈中只剩下 window 对象