全局执行上下文
在执行全局代码前将 window 确定为全局执行上下文。
对全局数据进行预处理:
var定义的全局变量赋值undefined添加为window的属性function声明的全局函数赋值添加为window的方法this赋值window
console.log(a1,window.a1) // undefined undefined
a2() // 'a2()'
console.log(this) // window
var a1 = 3
function a2() {
console.log('a2()')
}
console.log(a1) // 3
函数执行上下文
在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象(虚拟的,实际上不是一个对象,是在栈内存的一块封闭区域,函数调用完后该区域被销毁)
对局部数据进行预处理:
- 形参变量赋值实参,添加为执行上下文对象的属性
- arguments 赋值实参列表,添加为执行上下文对象的属性
- var 定义的局部变量赋值为 undefined 添加为执行上下文对象的属性
- function 声明的函数赋值添加为执行上下文对象的方法
- this 赋值调用函数的对象
function fn(a1) {
console.log(a1) // 2
console.log(a2) // undefined
a3() // 'a3()'
console.log(this) // window
console.log(arguments) // 类数组对象 [2,3]
var a2 = 3
function a3() {
console.log('a3()')
}
}
fn(2,3)