编程语言的作用域

一个变量的作用域 (scope) 是程序中可以使用这个变量的区域

  • 全局变量 拥有 全局作用域,在代码中任何地方都可以使用

  • 局部变量 拥有 局部作用域,仅在特定范围内可以使用

函数级作用域

在函数内声明的变量只在函数体内部可以使用,是局部变量;同时,函数参数也是局部变量,他们只在函数体内有定义。

有时函数作用域会造成问题,以Python为例:

1
2
3
4
5
6
7
8
9
10
print_is = []
for i in range(3):

def print_i():
print(i)

print_is.append(print_i)

for print_i in print_is:
print_i()

这里我们本希望批量生成打印i值的函数,但输出却是2 2 2,这是因为所有的print_i都使用了同一作用域的i

块级作用域

不是以函数、而是以{})为作用域的,以JS为例:

1
2
3
4
5
6
7
8
9
10
print_is = [];
for (const i = 0; i < 3; i++) {
print_is.append(() => {
print(i);
});
}

for (const print_i of print_is) {
print_i();
}

由于每个print_i都拥有不同作用域,所以可以打印出0 1 2

静态作用域(词法作用域)

在编译时决定作用域:

1
2
3
4
5
6
7
8
9
10
11
12
var value = 1;

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

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

bar();

结果为1foo() 寻找的是定义function时的作用域

动态作用域

在运行时决定作用域,上述代码打印2

foo() 寻找的是执行 foo() 时位于 bar() 内的作用域