# 执行环境栈 ECStack (Execution Context Stack)
- 浏览器会在计算机内存中分配一块内存, 专门用来供代码执行环境 栈内存
# 全局对象 GO (Global Object)
- 浏览器会把内置的一些属性方法放到一个单独的内存中 堆内存
- AAAFFF000 任何开辟的内存都有一个16进制的内存地址,方便后期找到这个内存
- 浏览器会让Window指向GO
提示
基于var
和function
在全局上下文中声明的全局变量也会给GO赋值一份(映射机制)
但是就let
和const
等ES6方式在全局上下文中创建的全局变量和GO没有关系
# 执行上下文 EC (Execution Context)
- 代码自己执行所在的环境
- 形成的全局执行上下文,进入到栈内存中执行 => "进栈"
- 执行完代码,可能会把形成的上下文释放 => "出栈"
- 函数中的代码都会在一个单独的私有的执行上下文中处理
- 块级的执行上下文
# 变量对象 VO (Varibale Object)
- 当前上下文创建变量和值的地方(每个上下文中会有一个自己的变量对象,私有函数当做叫做AO)
# 活动变量对象 AO (Activation Object)
- VO的一个分支
- 私有变量对象fn初始化步骤
- 初始化作用域链: ECFN
- 初始化this指向: window
- 初始化实参集合: arguments
- 形参赋值: y = AAAFFF000
- 变量提升: --
- 代码执行:
# 总结
- 创建一个值
- 基本类型(值类型)的值都是直接存在栈内存中
- 引用类型的值是先开辟一个堆把东西存储进去,最后把地址放栈里供变量调取使用
- 创建一个堆内存
- 把键值对存到堆内存
- 把堆内存放到栈内存中,供变量调用
- 创建一个变量
- 所有的指针赋值都是关联指向
- 让变量和值关联在一起
案例
var a = 12
var obj = {
name: 'dyc',
fn: (function (x){
return x+10
})(obj.name)
}
console.log(obj.fn) //=> Uncaught TypeError: Cannot read property "name" of undefind