执行上下文:在执行JS代码之前,需要先解析代码。解析的时候会先创建一个全局执行上下文环境,先把代码中即将执行的变量、函数声明都拿出来,变量先赋值为undefined,函数先声明好可使用。这一步执行完了,才开始正式的执行程序。
在一个函数执行之前,也会创建一个函数执行上下文环境,跟全局执行上下文类似,不过函数执行上下文会多出this、arguments和函数的参数。
全局上下文:变量定义,函数声明
函数上下文:变量定义,函数声明,this,arguments
执行上下文类型:
(1)全局执行上下文
任何不在函数内部的都是全局执行上下文,它首先会创建一个全局的window对象,并且设置this的值等于这个全局对象,一个程序中只有一个全局执行上下文。
(2)函数执行上下文
当一个函数被调用时,就会为该函数创建一个新的执行上下文,函数的上下文可以有任意多个
(3)eval函数执行上下文
执行在eval函数中的代码会有属于他自己的执行上下文,不过eval函数不常使用。
执行上下文栈:
(1)js引擎内部有一个执行上下文栈(Execution Context Stack,简称ECS),它是用于执行代码的调用栈。
(2)当JavaScript执行代码时,首先遇到全局代码,会创建一个全局执行上下文并且压入执行栈中
(3)每当遇到一个函数调用,就会为该函数创建一个新的执行上下文并压入栈顶
(4)引擎会执行位于执行上下文栈顶的函数
(5)当函数执行完成之后,执行上下文从栈中弹出,继续执行下一个上下文
(6)当所有的代码都执行完毕之后,从栈中弹出全局执行上下文
执行上下文总结:
1)执行环境有全局执行环境(也称为全局环境)和函数执行环境之分;
2) 每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;
3) 函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境;
4) 全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;
5)变量的执行环境有助于确定应该何时释放内存。