前言 我们先不看这个标题,来看下面这段代码是怎么运行的: 1 2 3 4 var num1=1 var num1=2 var result=num1+num2 console.log(result) 我相信,小伙伴都知道打印的是3把,这也太简单了,但是我们思考下
前言我们先不看这个标题,来看下面这段代码是怎么运行的:
我相信,小伙伴都知道打印的是3把,这也太简单了,但是我们思考下,这段代码执行时,到底进行了怎样的操作,这里我们要引进一个概念:初始化全局对象和执行上下文 初始化全局对象(GO)JS引擎在解析代码的时候,会在堆内存中创建一个全局对象叫:Gobal Object(GO)
执行上下文
执行上下文分为:
这里我们先分析下全局执行上下文,因为我们开头那段代码是全局代码 全局执行上下文在执行全局代码的时候,会创建全局执行上下文( GEC ),GEC会被放入ECS中去执行 GEC被放入ECS 包含两部分:
Java Script遇到函数代码如何执行?
FEC中包含三部分内容:
作用域是解析编译的时候就决定了,并不是执行调用的时候来我们看一段代码,一起看一下函数的执行过程,一起来思考下这段代码的运行结果
画个图分析一下吧 首先初始化全局对象GO,里面有Array、date、setTime等等,还有自己定义的 message对象初始值为undefined,foo和bar函数对象 开始执行代码前,会创建一个执行上下文栈ESC,开始执行全局代码,所以会创建一个全局执行上下文栈GEC,将GEC压入栈底,全局执行上下文包括两部分: 执行完第一行后,开始执行第9行代码 bar(),这里是函数的调用执行,js引擎会创建一个函数执行上下文FEC,压入栈中,FEC包含三部分: 第一部分:VO对象,这里指向bar自己的AO对象(包括形参和函数中定义的变量) 第三部分:this绑定,这里是指向windows(这个后续会开专题讲)
执行到bar函数的最后一行代码是foo(),此时又是一个函数的调用执行,又会创建一个foo的函数执行上下文,也包含上述的三部分:VO对象(指向foo的AO对象) 作用域链 和this绑定 执行完后,函数执行上下文执行完之后,就会弹出栈,foo的FEC先弹出栈,然后bar的FEC弹出栈,他们自个的AO对象最终也被释放 环境变量和记录我们上述所说的VO是基于早期的ECMAS规范,官网是这样说的: 这里借助coderwhy的翻译:每个执行上下文都关联一个变量对象(Vriable Object),在源代码中变量和函数的声明会被作为属性加入到变量对象中,对于函数来说,参数也会被加入到VO中但是ECMA5以后的版本,官网做了一些词汇用语的修改 每个执行上下文都会关联一个变量环境(variable Environment),在执行代码中变量和函数的声明会被当做环境记录(Environment Record)加入到变量环境中。 总结:
汇总一些名词解释,我们来解释一下:
|
2021-06-04
2019-01-10
2019-02-17
2021-09-12
2021-09-30