目前网上大多数流行的说法都是基于ECMAScript3版本的解析,并且在面试时问到的大多数都是ECMAScript3的版本内容。但是ECMAScript3终将过去, ECMAScript5必然会成为主流,所以最好也理解ECMAScript5甚至包括ECMAScript6以及更好版本的内容;事实上在TC39( ECMAScript5 )的最新描述中,和ECMAScript5之后的版本又出现了一定的差异;下面先从ECMAScript3中的概念学习JavaScript执行原理,事实上,它们只是在对某些概念上的描述不太一样,在整体思路上都是一致的。
JavaScript的执行过程
这段代码是如何在js中被执行的呢?
首先JS引擎会在代码执行前,在堆内存中创建一个全局对象叫Global Object (GO),这个对象所有的作用域都可以访问,里面包含里面会包含Date、Array、String、Number、setTimeout、setInterval等等,还有一个window对象指向自己
执行上下文
JS引擎内部有个执行上下文的栈(Execution Context Stack,简称ECS),它是用于执行代码的调用栈(注意这个不是物理意义上的栈,是逻辑层面的,只是说执行代码的逻辑像个栈)
现在它要执行我们的全局代码块,首先全局代码快会为了执行创建一个执行上下文Global Execution Context(GEC),执行上下文会被放到ECS里,GEC被放入到ECS中里面包含两部分内容
1.在代码执行前,在parser转成AST的过程中,会将全局定义的量、函数等加入到GlobalObject中,但是并不会赋值; 这个过程也称之为变量的作用域提升(hoisting)
2.在代码执行中,对变量赋值,或者执行其他的函数;