一.执行上下文
1.什么是执行上下文
- 执行上下文就是当前JavaScript代码在被解析和执行时存在的环境(地方),只要有javascript代码运行,那么它就一定是运行在执行上下文中
2.执行上下文的分类
(1)全局执行上下文,这是默认的,最基础执行上下文
- 不在函数内部的代码都位于全局执行上下文中
- 全局执行上下文,只有一个,浏览器中的全局对象就是window对象,this指向这个全局对象
(2)函数执行上下文
- 函数执行上下文:存在无数个,只有在函数被调用的时候才会被创建,每次调用函数都会创建一个新的执行上下文
(3)Eval函数执行上下文
- Eval函数执行上下文:指得是运行在eval函数中的代码,很少用(了解即可)
3.执行上下文的生命周期
- 执行上下文的生命周期包括三个阶段:创建阶段–执行阶段–回收阶段
(1)创建阶段
当函数被调用,但是未执行内部的任何代码之前,会做以下几件事
- 创建变量对象:首先会初始化函数的参数arguments,提升函数声明和变量声明。
- 创建作用域链:在执行上下文创建阶段,作用域链是在变量对象之后创建的,作用域链本身包含变量对象,作用域链用来解析变量的过程
- 确定this指向,
(2) 执行阶段
- 执行变量赋值,代码执行。
(3) 回收阶段
- 执行上下文出栈,等待虚拟机回收执行上下文
二.执行栈
执行栈得理解
- 执行栈,也叫调用栈,具有先进后出,后进先出,得原理,用于存储在代码执行期间创建得所有执行上下文我们可以吧执行栈想象为一个桶最先放进去得肯定是最后才拿出来的
- 当javascript引擎开始执行你第一行脚本代码得时候,它就会首先创建一个全局环境,把它压到执行栈中最底层 每当引擎碰到一个函数得时候,它就会创建一个函数环境,然后将这个函数环境压到执行栈中(是压到全局环境上面的) 引擎会执行位于执行栈 栈顶得执行上下文(一般是函数环境),当该函数环境执行结束后,对应得执行上下文就会被弹出清除掉,然后控制流程到达执行栈得下一个执行上下文
举个例子
<script>
var a = 10;
//函数也是全局变量
function f1() {
var b = 11
}
f1()
</script>