js运行机制

111 阅读2分钟

首先在我们打开浏览器运行代码时,每打开一个页面就会分出两块内存:一个是堆内存(heap)一个是栈内存(stack)两个运行内存

堆内存(heap):主要是存放引用数据类型的值

栈内存(stack):给代码提供可执行的环境和存储基本数据类型的值

ECStack(Execution context Stack) 执行环境栈(栈内存,从内存中分配出来的一块内存)

EC(Execution Context)执行上下文(在编程语言中,代码执行,为了区分全局作用域和函数执行所处不同的作用域,目的是为了区分每个词法作用域下代码的独立性)EC 就是代码执行所处的范围

js的执行环境里的代表的每一块是:

EC(g):全局执行上下文

EC(function):函数执行的上下文

VO 和AO:在每一个执行上下文中,代码执行的时候,都会存贮一些变量:

全局上下文中的变量存储在VO

私有上下文中的变量存储在AO

GO:浏览器把一些内置的属性和方法放到了GO中,并且在全局执行上下文(EC(g))中创建了一个window变量对象,并且让其指向GO

代码是自上往下执行的,在此之前还有一个变量提升的阶段,(不会的)你们可以搜一下

2.赋值操作的三部曲:

1.先创建值

2.再创建变量

3.最后把创建的变量和值关联在一起

js的运行是会分为两种情况:一种是同步任务,一种是异步任务

同步任务:在主线程上排队进行的,按顺序执行

异步任务:不进入主线程,而进入event table执行,异步事件完成有结果后把结果回调函数放入“任务队列”(taskqueue),只有“任务队列”通知主线程某个异步任务可以执行了,该任务才会进入主线程执行

例题:

    var x=12;
1.  let y=13;
1.  z=14;
1.  console.log(window.x);
1.  console.log(window.y);
1.  console.log(window.z);
1.  console.log(x);
1.  console.log(y);
1.  console.log(z);

模拟运行图

image.png