阐述几个概念
1. ECStack ( Execution Context Stack)执行环境栈
- 浏览器会在计算机内存中分配一块内存,专门用来供代码执行的 =>栈内存ECStack ( Execution Context Stack)执行环境栈
2. EC ( Execution Context ) 执行上下文:
- 代码自己执行所在的环境
- +全局的执行上下文EC(G)
- +函数中的代码都会在一个单独的私有的执行 上下文中处理
- +块级的执行上下文
3.Stack栈内存:
- JS之所以能够在浏览器中运行,是因为浏览器给JS提了执行的环境提,->供代码执行的环境
4.Heap堆内存:
- 存放东西(存放属性和方法)
5.GO ( Global Object )全局对象
- 浏览器端会让window指向GO
- 浏览器把内置的一些属性方法放到一个单独的内存中堆内存( Heap )
6. VO ( Varibale Object )变量对象:
- 在当前的上下文中,用来存放创建的变量和值的地方(每一个执行 上下文中都会有一个自己的变量对象,函数私有上下文中叫做**AO ( Activation Object )**活动对象,但是也是变量对象)
- AO是VO的一个分支,都是变量对象
- AO是活动对象,函数中的变量对象都称为AO
7.VO(G)全局变量对象: -全局上下文中用来存储全局变量的空间,它不是GO => 只不过某些情况下VO(G)中的东西会和GO中的东西有所关联而已“映射机制”
8. var a = 12 是如何操作的
- 创建一个值
- 创建一个值
- 让变量和值关联在-起
所有的指针赋值都是指针的关键指向
- 基本数据类型值都是直接存储到栈内存中的
- 引用数据类型值是先开辟一个堆内存 ,把东西存储进去,最后把地址放到栈中供变量关联使用的
9. a.x = a = {n:2}
- 等价于: a.x = 值 , a = 值,只不过a.x的优先级大于a,先执行a.x={n:2}
/*
* 1.创建值
* + 开辟一个堆 AAAFFF000
* + 存储键值对
* name:'珠峰培训'
* fn:自执行函数执行,需要把obj.name的值当做实参传递进来 =>undefined.name
*/
var obj = {
name: '珠峰培训',
fn: (function (x) {
return x + 10;
})(obj.name) //在给fn赋值的时候,是把自执行函数执行的返回结果赋值给fn属性
// Uncaught TypeError: Cannot read property 'name' of undefined
};
console.log(obj.fn);
函数堆
- 把函数体中的代码当做字符串存储到堆中 “代码字符串” =>创建函数不执行,函数没啥用
- 函数也是对象,他也有自己的键值对
函数执行的目的?
想让之前存储在堆中的代码字符串执行 -> 代码执行就要有自己的执行环境