作用域

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

解释:执行 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

解释:执行 bar(), 发现函数内部有这个变量,所以打印 2。(变量查找的顺序:从内到外)

在发给朋友第一个题之后,又做了简单的变形,试试看自己知道打印的值吗?

function foo() {
    console.log(value)
}

function bar() {
    var value = 2
    foo()
}

bar()
1
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

# 作用域链

当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。

上次更新: 5/12/2021, 10:18:03 AM