作用域
AprilTong 4/13/2021 Javascript
# 作用域概念
- 作用域就是在代码运行时,在某些特定部分中变量、函数和对象的可访问性。即就是作用域决定了代码块中变量和其他资源的可见性。
- 作用域是一个独立的地盘,让变量不会外泄、暴露出去,其作用就是隔离变量,不同作用域下同名变量不会有冲突。
# 词法作用域
Javascript 采用的是词法作用域,函数的作用域在函数定义的时候确定。 补充:与词法作用域对应的是动态作用域,函数的作用域是在函数调用的时候确定。
var data = 1
function foo() {
console.log(value)
}
function bar() {
var value = 2
foo()
}
bar() //1
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
解释:执行 bar 函数,内部调用了 foo 函数,先从 foo 函数内部查找是否有变量 value,发现没有,根据书写的位置,查找上面一层的代码,发现有定位了 value,这个变量,值为 1.
var value = 1
function bar() {
var value = 2
console.log(value)
}
bar() //2
1
2
3
4
5
6
2
3
4
5
6
解释:执行 bar(), 发现函数内部有这个变量,所以打印 2。(变量查找的顺序:从内到外)
在发给朋友第一个题之后,又做了简单的变形,试试看自己知道打印的值吗?
function foo() {
console.log(value)
}
function bar() {
var value = 2
foo()
}
bar()
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
var value = 1
function foo() {
console.log(value)
}
function bar() {
value = 2
foo()
}
bar()
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 作用域链
当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。