通过执行上下文来跟踪函数的运行
# 3. 通过执行上下文来跟踪函数的运行
**知识点**
- 执行上下文
----------------------------------------
## 执行上下文
- `JS`内部使用`执行上下文`来跟踪函数的执行
- `JS`使用调用栈`call stack`做为函数执行上下文栈来跟踪运行状态
----------------------------------------
### code/demo03.html
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>通过执行上下文来跟踪函数的运行</title>
</head>
<body>
<script>
// 牢记: js中,代码执行的基本单元,应该是函数,使代码复用,维护变得更轻松
// 每一行语句不是位于全局,就是位于函数内,不管在哪里,都位于特定作用域内,都有特定上下文(执行环境)
// 全局上下文: 有且只有一个,记不消失,除非关闭页面
// 函数上下文: 每次调用时都后创建, 使用变量对象来表示(包含上下文中的变量和函数)
// js内部使用 "执行上下文" 来跟踪函数的执行, 使用"执行上下文栈(调用栈)"来跟踪
// 栈是一种添加与删除只能在一端进行的特殊列表,非常适合于管理代码的运行顺序
// 之前,变量只存在于函数作用域,全局变量实际上全局对象的属性,ES6实现了块级作用域,修改了这个世纪大Bug
function outer(n) {
let num = n;
function inner(m) {
return num + m;
}
return inner;
}
let func = outer(10);
// 此时调用会形成闭包
// 闭包就像是inner函数的小金库, 只要是与它同处一个词法作用域内的可见成员,全部被它金屋藏娇,收入囊中,这个金屋就是闭包
// inner函数非常十珍爱它的小金库,随身携带,寸步不离,哪怕在光天化日的全局环境下调用它, 它还是能偷偷访问自己的小金库中的数据
let result = func(20);
console.log( result );
</script>
</body>
</html>
```