相关术语
栈内存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没有var ) var 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} b和a 指向同一地址
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}}
如有理解不正确的,欢迎指出~