# 05 详细解读函数底层

By [xukai](https://paragraph.com/@xulai) · 2021-12-28

---

#### 创建函数

    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);
    

![](https://storage.googleapis.com/papyrus_images/62e05224df9a5c9bfd2ef973f8da697c733f32d75a935f8442f60a337ead6998.png)

---

*Originally published on [xukai](https://paragraph.com/@xulai/05)*
