对执行上下文的理解
在执行JS之前,需要先解析代码,解析的时候会先创建一个全局执行上下文,将所有的函数声明和变量声明提升,变量声明赋值undefined,函数声明可以使用。解析完成后即可执行程序。
在执行某个函数之前,会先创建一个函数执行上下文,基本与全局上下文一致,但不同的点是 this 指向、arguments 和函数的参数
-
类型
-
全局执行上下文
-
函数内部以外的代码都位于全局上下文中
-
创建一个全局对象,window对象
-
this 指针指向全局对象
-
-
函数执行上下文:函数被调用时,创建函数执行上下文
-
每个函数都有自己的执行上下文
-
一个程序中可以有任意数量的全局上下文
-
每个执行上下文被创建时,都会按照特定的顺序执行一些操作
-
-
eval执行上下文:运行在eval函数中的代码获得自己的执行上下文
-
-
执行上下文栈:
JavaScript引擎使用执行上下文栈管理执行上下文
当 JavaScript 执行代码时,首先会遇到全局代码,创建一个全局上下文并压入执行上下文栈中,每当一个函数调用,就会创建一个函数执行上下文并压入栈顶。JavaScript 引擎会执行位于栈顶的上下文,当执行完毕后,从栈顶弹出,继续执行下一个上下文,最后执行全局执行上下文。
-
生命周期:
创建—执行—回收
-
创建:当函数被调用,但还未执行时,会做以下操作
- 创建变量对象:初始化函数的参数arguments,提升函数声明和变量声明
- 创建作用域链
- 确定 this 指向
-
执行
变量赋值,执行代码
-
回收
执行上下文出栈,等待回收
-