创建函数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);