先说说栈吧!
栈的执行顺序是先进后出,后进先出!
执行上下文栈
执行全局代码和函数时,都会产生一个环境,叫做执行上下文。一开始打开页面的时候。全局环境(全局执行上下文)就会入栈。当执行到函数时,该函数也会产生一个执行环境,并入栈。(如果函数里包含另一个函数,同理)等该函数执行完了,就将该函数的执行环境弹出栈,返回全局上下文环境。
举个例子
当加载<script>中的代码时,全局执行环境入栈
当执行到 10 行的时候,sayHello执行环境入栈
sayHello中还有一个sayWorld环境,执行到该环境(第 8 行)的时候,sayWorld执行环境入栈
sayWorld执行完毕后,就弹栈,回到sayHello执行环境,再sayHello执行完毕后,弹栈。回到全局执行环境。关闭浏览器的时候,全局执行环境也弹出栈!
整个入栈弹栈过程
执行上下文
什么是执行上下文。个人理解为代码的执行环境。不同的代码有不同的执行环境。
一个执行上下文的生命周期分为两阶段。创建阶段和代码执行阶段
创建阶段是为该环境的代码执行先做好准备。
创建阶段:包括创建变量对象、建立作用域链?、确定this的指向
1、创建变量对象:
① 建立arguments对象和参数的赋值。
②函数声明:也就是使用function关键字声明的函数。在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。如果函数名的属性已经存在,那么该属性将会被新的引用所覆盖。
③变量声明:检查当前上下文中的变量声明,每找到一个变量声明,就在变量对象中以变量名建立一个属性,属性值为undefined。如果该变量名的属性已经存在,为了防止同名的函数被修改为undefined,则会直接跳过,原属性值不会被修改。
举个例子:
这里作用域链和this的指向先不讲
然后就是执行阶段了。
执行的时候,若代码需要获取变量或函数或对象,就会到变量对象中去取!
若执行到代码赋值(如var eye = 2)就更行变量对象中同名变量的变量值!
在基本变量未执行赋值的时候读取变量,会取得undefined!
先这样吧。