作用域:表示当前执行代码对变量的访问权限
作用域分为两种:
- 静态作用域(词法作用域):函数的作用域由函数定义时决定的,JavaScript就属于这一种。
- 动态作用域:函数的作用域由函数运行时决定的。
从下面例子可以看出区别:
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
// 结果是 ???
假定采用的是静态作用域,执行过程如下:
执行foo函数时,先查找函数内部有没有value变量,发现没有,就查找foo函数定义时的外层全局变量,发现有一个全局变量value = 1,所以打印出来1
假定采用的是动态作用域,执行过程如下:
执行foo函数时,先查找函数内部有没有value变量,发现没有,就查找foo函数运行时的外层bar函数,发现有一个局部变量value = 2,所以打印出来2
因为JavaScript是静态作用域,所以输出的结果是1。