堆栈内存

161 阅读3分钟

相关术语

栈内存Stack&堆内存Heap

declare(声明)&defined(定义)

ECStack(Execution Context Stack 执行上下文栈) 和 EC Execution Context 执行上下文

GO(Global Object) 全局对象,浏览器加载页面默认形成的东西。存放浏览器供JS调用的属性和方法。有setTimeout setInterval。window指向这个对象。

VO(Varibale Object) 变量对象,存储当前上下文声明的变量

AO(Active Ojbect) 活动对象,变量对象的一种,存放函数执行时候的变量对象。

JS代码的运行环境

  • 浏览器内核(引擎)
  • 服务器node
  • webview APP里面

据我所学到的,就是以上三种啦,那我们分析的都是运行在浏览器上的。

运行机制

浏览器能够运行js代码,他会在计算机的内存中分配出内存,用来供代码执行的。这个内存就是栈内存Stack,即ECStack执行上下文栈。 栈内存:供代码执行&存储基本数据类型值。

为了区分是哪个区域(全局或者函数等)下的代码执行,会产生一个执行上下文 EC。页面一加载,先形成全局执行上下文 EC(G)和存储全局变量对象VO(G)(存储当前上下文声明的变量)。之后函数执行形成函数对应的执行上下文EC和存储函数内部的VO私有变量对象。私有变量对象包括两种:当前上下文声明的变量和形参。

赋值原理

let a = 12 或者 a = {} 执行原理:

  • 第一步:先创建值

    基本类型值,直接存储在栈内存中。

    引用类型值,开辟一个单独的内存空间(堆内存Heap)存储信息。 有一个16进制的地址,(0x000000) 把对象中的键值对分别存储到堆内存中, 把堆内存的地址放置到栈中,供变量调用

  • 第二步:声明变量 declare

    存放到当前上下文的变量对象中(VO/AO)

  • 第三步:让变量和值通过指针关联到一起 赋值操作 defined

var a = 12 执行原理:

  • 第一步:变量提升阶段就已经声明变量 declare

    存放到当前上下文的变量对象中(VO/AO)

  • 第二步:执行阶段再创建值

    基本类型值,直接存储在栈内存中。

    引用类型值,开辟一个单独的内存空间(堆内存Heap)存储信息。 有一个16进制的地址,(0x000000) 把对象中的键值对分别存储到堆内存中, 把堆内存的地址放置到栈中,供变量调用

  • 第三步:让变量和值关联到一起 赋值操作 defined

var n; 只声明了没有定义,所以默认值 undefined的

赋值练习题

// 连续赋值拆解:
var a=12,b=13  //=>var a=12; var b=13 
var a=b=13     //=>b=13;(b没有varvar a=13  (a=b也是一样的)
//正常处理都是从右到左处理的
//特殊的情况
a.x=b=13  // 或者 b=a.x=13  这种都先计算a.x,因为他的优先级是高的 (成员访问的优先级19 仅次于()括号这种模式20)

// 分析此题
var a ={n:1}
var b =a  
a.x = a ={n:2}
console.log(a.x)
console.log(b)
=>
var a ={n:1}
var b = a    //  b={n:1}  ba 指向同一地址
a.x = {n:2}  // a=b={n:1,x:{n:2}}
a = {n:2}    // a重新赋值 a={n:2}
console.log(a.x)  // undefined
console.log(b)   // {n:1,x:{n:2}}

如有理解不正确的,欢迎指出~