全局对象GO(Global Object)
变量对象VO(Variable Object)
活动对象AO(Active Object):每个执行上下文都会有一个自己的变量对象,函数私有上下文中叫活动对象,也是私有变量。
变量在内存栈堆中的存储
原理:
JavaScript中创建变量的方式(其实都是变量和值产生关联的过程):
-
先创建左边变量,再创建右边值,然后等号关联。
-
注意先看是不是创建变量,然后看看右边是不是创建值。
-
连等赋值的时候(a = b = 3),最右边先产生关联(即 b = 3;a = 3);但下图中是a.x先产生关联(不论它在左边还是右边),因为a.x属于成员访问,运算优先级很高。
解释:(一个变量只能指向一个地址)
- let a = {n:1}, 先给a分配一个栈空间,然后给{n:1}分配一个堆内存地址,然后让a指向对内存地址(产生关联)。
- let b = a, 让b 指向a的指向地址
- a.x = a = {n:2}, 先产生一个a的属性x(对象中有这个属性就修改,没有就新增),创建一个新值{n:2},让a.x指向新值的堆内存地址AAAFFF111(此时a仍是指向AAAFFF000);让a 指向这个新值的地址
解释:
- 前三行结果是n、m、x指向同一个地址AAAFFF000
- m[0]修改了数组第一个数
- x = [30,40], x[0] = 200; 创建了新值(等同于第一行代码),x指向了新的内存地址AAAFFF111;并修改了第一个数
- m = x ,m[1] = 300, 将m 重新和x建立关联,并修改了数组第一个值
- n[2] = 400, 数组n中新增第三个数
函数在内存中的运行
其他知识