05 详细解读函数底层

创建函数

1. 开辟一个堆内存「在堆内存中开辟一个空间」,有一个16进制的地址
2. 存储的内容
    + 函数体中的代码当做字符串先存储起来
    + 当做普通对象也会存一些键值对
3. 创建函数的时候,声明了其作用域[[Scope]]「创建函数所在的上下文」
4. 把堆内存的地址放置在栈中,供函数名「变量」去调用

执行函数

1. 形成一个私有的执行上下文EC(...),然后进栈执行
    + AO(...):私有变量对象
2. 初始化作用域链
   初始化THIS
   初始化ARGUMENTS实参集合
   形参赋值(形参是私有变量 & 当前私有上下文中声明的变量也是私有变量)
   变量提升
3. 根据情况,决定当前形成的私有上下文是否会出栈释放「一般都会出栈释放」

函数再次执行,所有流程重新走一遍。「所以函数执行多次,每一次之间是没有直接关系的」

代码案例分析一

var x = [12, 23];
function fn(y) {
    y[0] = 100;
    y = [100];
    y[1] = 200;
    console.log(y);
}
fn(x);
console.log(x);
post image