js底层运行机制

1,232 阅读2分钟

阐述几个概念

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 是如何操作的

  1. 创建一个值
  2. 创建一个值
  3. 让变量和值关联在-起

所有的指针赋值都是指针的关键指向

  • 基本数据类型值都是直接存储到栈内存中的
  • 引用数据类型值是先开辟一个堆内存 ,把东西存储进去,最后把地址放到栈中供变量关联使用的

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);

函数堆

  1. 把函数体中的代码当做字符串存储到堆中 “代码字符串” =>创建函数不执行,函数没啥用
  2. 函数也是对象,他也有自己的键值对

函数执行的目的?

想让之前存储在堆中的代码字符串执行 -> 代码执行就要有自己的执行环境

几张图搞懂js底层是如何运行的