执行上下文栈和执行上下文(1)

先说说栈吧!
栈的执行顺序是先进后出,后进先出!

执行上下文栈
执行全局代码和函数时,都会产生一个环境,叫做执行上下文。一开始打开页面的时候。全局环境(全局执行上下文)就会入栈。当执行到函数时,该函数也会产生一个执行环境,并入栈。(如果函数里包含另一个函数,同理)等该函数执行完了,就将该函数的执行环境弹出栈,返回全局上下文环境。

图片借鉴自王福朋大神的博客>﹏<

举个例子


当加载<script>中的代码时,全局执行环境入栈

当执行到 10 行的时候,sayHello执行环境入栈

sayHello中还有一个sayWorld环境,执行到该环境(第 8 行)的时候,sayWorld执行环境入栈


sayWorld执行完毕后,就弹栈,回到sayHello执行环境,再sayHello执行完毕后,弹栈。回到全局执行环境。关闭浏览器的时候,全局执行环境也弹出栈!

整个入栈弹栈过程

执行上下文
什么是执行上下文。个人理解为代码的执行环境。不同的代码有不同的执行环境。
一个执行上下文的生命周期分为两阶段。创建阶段和代码执行阶段
创建阶段是为该环境的代码执行先做好准备。

创建阶段:包括创建变量对象、建立作用域链?、确定this的指向

1、创建变量对象:
① 建立arguments对象和参数的赋值。

②函数声明:也就是使用function关键字声明的函数。在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。如果函数名的属性已经存在,那么该属性将会被新的引用所覆盖。
③变量声明:
检查当前上下文中的变量声明,每找到一个变量声明,就在变量对象中以变量名建立一个属性,属性值为undefined。如果该变量名的属性已经存在,为了防止同名的函数被修改为undefined,则会直接跳过,原属性值不会被修改。

举个例子:



这里作用域链和this的指向先不讲

然后就是执行阶段了。
执行的时候,若代码需要获取变量或函数或对象,就会到变量对象中去取!
若执行到代码赋值(如var eye = 2)就更行变量对象中同名变量的变量值!
在基本变量未执行赋值的时候读取变量,会取得undefined!

先这样吧。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容