let a = { n: 1 }
let b = a
a.x = a = { n: 2 }
console.log(a.x);
console.log(b);
- 浏览器打开一个页面,首先会从计算机的虚拟内存中分配两块内存出来
栈内存Stack[ECStack] 执行上下文栈
+ 供代码执行
+ 存储声明的变量和基本数据类型的值
堆内存Heap
+ 存储对象类型的值
-
默认在堆内存中,开辟一个空间[16进制地址],GO(global object)全局对象,存储了浏览器为js提供的内置API
-
创建一个全局的执行上下文EC(G)
+ 供全局代码代码执行的环境
+ 进栈执行
执行上下文就是栈内存空间,在代码执行过程中,遇到声明变量,需要一个存放变量的地方-->变量对象 VO(全局执行上下文的变量对象)/AO(函数执行上下文的活动对象)
let a = b = 12
// 相当于
b = 12
let a = b
正常:从右到左计算,只有a是let声明,b不带let
特殊:遇到优先级高的则优先处理
- 除了EC(G) 还有函数执行上下文EC(F)以及块执行上下文EC(Block),这个等我学完之后过来补上
debugger
var a = 12
let b = 13
全局上下文中
- 基于var function声明的变量,没有放在VO(G)中,直接存储于GO中,作为window的成员
- 基于let const声明的变量,放在VO(G)中
图中的Script就是VO(G),Global就是GO
// 以下代码为js引擎执行RHS查询,先看VO(G)再看GO,都没有会报错Uncaught ReferenceError: a is not defined
console.log(c);
// 直接在GO找,找不到报错undefined
console.log(window.c);
// 则不会报错,这是LHS查询,在非严格模式下,全局作用域会在GO上创建一个属性d,并赋值为2
d = 2
网友评论