变量的作用域
全局作用域
在浏览器中,通常认为window是全局作用域。
var a = 2;
console.log(window.a) // 2
在函数之外声明的变量叫做全局变量,因为它可被当前文档中的任何其他代码所访问,在函数内部声明的变量,叫做局部变量,因为它只能在当前函数的内部访问。
作用域链
作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问
个人理解作用域链就是调用变量是一层一层的向上进行查找,最终找到全局作用域的过程,如console.log(a)时会由fn => obj => window的顺序进行查找,最终在window中找到了变量a,查找不到c则报错。
var a = 2;
var obj = {
fn: function () {
var c = 3;
console.log(a); // 2
console.log(b); // b is not defined
}
}
obj.fn();
作用域链不会由顶端向下查找
将代码稍做修改,c在下层作用域中定义,作用域链不会由顶端向下查找,因此在全局作用域查找不到就报错了。
var a = 2;
var obj = {
fn: function () {
var c = 3;
console.log(a); // 2
}
}
obj.fn();
console.log(c) // c is not defined