# 作用域
# 1. 什么是执行上下文
执行上下文在JavaScript中是一个非常重要的概念- 变量以及函数的上下文决定了他们可以访问哪些数据
 - 每个上下文都会关联一个
变量对象,上下文中变量以及函数都会定义在变量对象中 - 每次函数执行的时候,都会形成一个执行上下文。多个函数依次执行会形成一个执行上下文栈。函数执行结束后会从栈中弹出,同样
变量对象也会被销毁
 
# 2. 什么是作用域
- 上下文中的代码在执行过程中,会创建变量对象的一个作用域链。
 - 多个作用域链决定了各级上下文中的代码的访问变量和函数的顺序

 
function a() {
  const test = 'a'
  function b() {
    console.log(test)
    const test1 = 'c'
    console.dir(b)
    function c() {
      console.log(test, test1)
      console.dir(c)
    }
    c()
  }
  b()
}
a()
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 3. 作用域的确定在哪个阶段呢
const name = '李四'
function run() {
  const name = '张三'
  return function exec() {
    console.log(name) // 张三
    console.dir(exec)
  }
}
const fn = run()
fn()
 1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12

- 上述结果是
 张三并非李四。其实也是说明了变量的查询范围跟定义的位置有关,跟执行的位置无关。为什么会会先这种结果呢???- 因为在函数创建的时候,函数的作用域链已经确定好了,当函数无论在什么位置执行。当前作用域查询不到变量时,会沿着作用域链向上查找。直到找到位置/ 找到顶级作用域也找不到