什么是作用域
作用域(scope)指的是变量存在的范围,在ES5的规范中,Javascript只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。
全局变量与局部变量
- 函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取
var a= 1;
function f() {
console.log(a);
}
f() // 1
- 在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)
function f() {
var a = 1;
}
a // ReferenceError: a is not defined
- 函数内部定义的变量,会在该作用域内覆盖同名全局变量
var a = 1;
function f() {
var a = 2;
console.log(a);
}
f() // 2
a // 1
作用域链
JavaScript上每一个函数执行时,会先在自己创建的AO上找对应属性值。若找不到则往父函数的AO上找,再找不到则再上一层的AO,直到找到大boss:window(全局作用域)。 而这一条形成的“AO链” 就是JavaScript中的作用域链。