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