大家好,本文将围绕javascript在什么地方执行展开说明,简述javascript的执行原理是一个很多人都想弄明白的事情,想搞清楚详细说明js的执行过程需要先了解以下几个事情。
JavaScript的执行过程
1、过程1:解析
V8引擎在堆内存中创建一个全局对象:Global Object
1)这个对象可以访问所有的作用域;
2)里面包含Date、Array、String、Number、setTimeout、setInterval等
3)其中还有一个window属性指向自己,也就是指向Global Object对象
2、过程2:运行代码
①V8为了运行代码,内部会有一个执行上下文栈(Execution Context Stack,简称ECStack函数调用栈),用于执行代码的调用栈,一般是在里面放函数的。
②因为我们要执行的是全局代码,为了全局代码能够正常的运行,需要创建一个全局的代码块Global Execution Context (GEC),GEC会被放进ECS中执行python for语句用法。
③GEC被放入ECS中包含两部分内容:
第一部分:在代码执行前,在parser转成AST的过程中,会将全局定义的变量、函数等加入到GlobalObject中,但是不会被赋值;这个之中涉及到变量的作用域提升。
第二部分:在代码执行中,对变量赋值,或者执行其他函数。
遇到函数该如何执行?
但是在执行函数的时候,和变量不太一样,变量涉及到作用域提升的问题,但是如果定义了一个函数,那么函数调用写在函数定义之前或者之后都能够执行。因为在解析阶段解析出这是一个函数,那么就会为这个函数创建一个存储函数对象,然后指向它,在需要调用的时候去执行函数体内部的代码。
1)在解析函数称为AST树结构时,会创建一个Activation Object(AO):AO中包含形参,arguments、函数定义和指向函数对象、定义的变量。
执行阶段:
执行完毕:
如果想要再次调用函数foo,就直接从头到尾再执行一遍。
2)作用域链:由VO(也就是函数中的AO对象)和父级VO组成,查找时会一层一层查找
函数中嵌套函数的情况
执行阶段
当执行bar()中的打印工作的时候,寻着作用域链去找name,最终能找到GO中的name
执行结束
最终两个函数的执行上下文都会弹出调用栈然后被销毁,它们指向的AO对象也会销毁。
函数中调用函数的情况
编译阶段
执行代码
函数的父级作用域和它的定义位置有关系,和调用位置是没有关系的。