浏览器底层机制 堆(heap) 栈(stack)内存

javaScript

# 执行环境栈 ECStack (Execution Context Stack)

  • 浏览器会在计算机内存中分配一块内存, 专门用来供代码执行环境 栈内存

# 全局对象 GO (Global Object)

  • 浏览器会把内置的一些属性方法放到一个单独的内存中 堆内存
  • AAAFFF000 任何开辟的内存都有一个16进制的内存地址,方便后期找到这个内存
  • 浏览器会让Window指向GO

提示

基于varfunction在全局上下文中声明的全局变量也会给GO赋值一份(映射机制)

但是就letconst等ES6方式在全局上下文中创建的全局变量和GO没有关系

# 执行上下文 EC (Execution Context)

  • 代码自己执行所在的环境
  • 形成的全局执行上下文,进入到栈内存中执行 => "进栈"
  • 执行完代码,可能会把形成的上下文释放 => "出栈"
  • 函数中的代码都会在一个单独的私有的执行上下文中处理
  • 块级的执行上下文

# 变量对象 VO (Varibale Object)

  • 当前上下文创建变量和值的地方(每个上下文中会有一个自己的变量对象,私有函数当做叫做AO)

# 活动变量对象 AO (Activation Object)

  • VO的一个分支
  • 私有变量对象fn初始化步骤
    • 初始化作用域链: ECFN
    • 初始化this指向: window
    • 初始化实参集合: arguments
    • 形参赋值: y = AAAFFF000
    • 变量提升: --
    • 代码执行:

# 总结

  1. 创建一个值
    • 基本类型(值类型)的值都是直接存在栈内存中
    • 引用类型的值是先开辟一个堆把东西存储进去,最后把地址放栈里供变量调取使用
      • 创建一个堆内存
      • 把键值对存到堆内存
      • 把堆内存放到栈内存中,供变量调用
  2. 创建一个变量
    • 所有的指针赋值都是关联指向
  3. 让变量和值关联在一起

案例

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 
Last Updated: 2021-04-26 14:38:08