1: 代码分类(位置)
全局代码
函数(局部)代码
2: 全局执行上下文
在执行全局代码前将window 确定为全局执行上下文
对全局函数进行预处理
2.1: var 定义的全局变量 ===> undefined, 添加为window 的属性
2.2: function 声明全局函数 ===> 赋值 (fun), 添加为window 的方法
2.3: this ===> 赋值 (window)
2.4: 开始执行全局代码
3: 函数执行上下文
3.1: 在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象
对局部数据进行预处理
形参变量 ==> 赋值 (实参) ==> 添加为执行上下文的属性
arguments ===> 赋值 (实参列表), 添加为执行上下文属性
var 定义为全局变量 ===> undefined, 添加为执行上下文属性
function 声明的函数 ===> 赋值 (fun), 添加为执行上下文的方法
this ===> 赋值 (调用函数的独对象)
开始执行函数体代
----------------------------------------------------------------------------------------------------------------------
在我执行全局代码之前已经存在了
console.log(this); 在执行代码块之前: this 已经存在了
var a1 = 10;
console.log(a1); // 10
console.log(this.a1); // 10 this 指向全局window
window: 代表整个窗口, 创建一个变量在全局执行上下文查找, 存在全局window 中
// 函数执行上下文
function fn(a1) {
console.log(a1); // 2
console.log(a2); // undefined
a3(); // a3()
console.log(this); // window 全局
console.log(argumnets); // [2 , 3] 伪数组
var a2 = 3;
function a3() {
console.log('a3()')
}
}
fn(2, 3);
内存空间是隔离的, 相互不会影响。
变量/ 函数提升就是预处理。
-------------------------------------------------------------
执行上下文栈
1: 在全局代码执行前 js引擎就会创建一个栈来存储管理所有的执行上下文对象。
2: 在全局执行上下文创建后, 将其添加到栈中(压栈)
3: 在函数执行上下文创建后, 将其添加到栈中(压栈)
4: 在当前函数执行完成以后, 将栈顶的对象移除(出栈)
5: 当所有的代码执行完毕以后, 栈中只剩下window
-------------------------------------------------------------
创建上下文对象, 函数被调用了就会创建词一个上下文对象, n + 1
n: 代表函数被调用次数 1: 全局对象window 对象
栈是一种数据结构: 先进后出, 后进先出
一个函数执行完会释放内存空间,当前执行总是栈顶的那个上下文。