JS之所以能够在浏览器中运行,是因为浏览器给JS提供了执行的环境 => 栈内存(Stack)
浏览器会在计算机内存中分配一块内存,专门用来供代码执行的 => 栈内存ECStack(Execution Context Stack)执行环境栈
全局对象GO(Global Object)
- 浏览器把内置的一些方法放到一个单独的内存中 堆内存(Heap)
- 任何开辟的内存都有一个16进制的内存地址,方便后期找到这个内存
- 浏览器会让window指向GO ,浏览器端window指向的就是全局对象
栈内存:提供代码执行的环境
堆内存:存放东西(存放的是属性方法)
EC(Execution Context) 执行上下文:代码自己执行所在的环境
- 全局的执行上下文 EC(G)
- 函数中的代码都会在一个单独的私有的执行上下文中处理
- 块级的执行上下文
VO(Varibale Object)变量对象:在当前的上下文中,用来存放创建的变量和值的地方(每一个执行上下文中都会有一个自己的变量对象 ,函数私有上下文中的叫AO(Activation Object)活动对象,但是也是变量对象,是VO的一个分支)
- ECStack (Execution Context Stack)执行环境栈
- EC(G) 全局的执行上下文
- VO(G)全局变量对象 Varibale Object Global
- AO(Activation Object)活动对象
var a = 12;
/*
* 这一步是如何操作的?
* 1. 创建一个值
* 2. 创建一个变量
* 3. 让变量和值关联在一起
*
* 所有的指针赋值都是指针的关联指向
*/
- 基本数据类型的值都是直接存储到栈内存中的
- 引用数据类型值是先开辟一个堆内存,把东西存储进去,最后把地址放到栈中供变量关联使用的
var obj = {
name: "Judy",
fn: (function (x){
return x + 10;
})(obj.name)
}
console.log(obj); // Cannot read property 'name' of undefined
/**
* 解析
* 在此之前会变量提升声明变量obj => undefiend
* 1. 创建值
* + 开辟一个堆 AAAFFF000
* + 存储键值对
name: 'Judy',
fn: 自执行函数,需要把obj.name的值当作实参传递进来 => undefined.name
*/