任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
执行环境
在说作用域之前,要提到JavaScript,中最重要的概念之一,执行环境(execution context,为了简单起见,也有称为环境的)。执行环境定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
每个函数都有自己都在执行环境,当执行流进入一个函数时,函数都环境就会被推入一个环境栈中。当代码在一个环境中执行时,会创建变量对象都一个作用域链(scope chain)。作用域链的用途是保证对执行环境有访问权对所有变量和函数的有序访问。
标示符的解析是沿着作用域链一级一级地搜索标示符的过程。搜索过程始终从作用域的开端开始,然后逐级地向后回溯,直到找到标示符为止,如果没有找到标示符,通常会导致错误发生。
全局作用域
全局变量:其他任何位置使用var声明的的变量,函数除外,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用。所有在全局作用域中声明的变量函数都会变成window对象属性和方法。
全局变量,如果页面不关闭,那么变量所占用的内存就不会释放,就会占空间,消耗内存。
1、在最外层定义的变量和函数拥有全局作用域。
例子:
var out = "hello";
function outFn(str) {
console.log(str);
}
function demo() {
outFn(out);
}
console.log(demo());
//输出:hello
2、未声明直接赋值的变量拥有全局作用域。
例子:
function demo() {
out = "hello";
}
demo();
console.log(out);
//输出:hello
3、在浏览器中,定义在window对象上的属性和方法,拥有全局作用域。
例子:
window.out = "hello";
function demo() {
console.log(out);
console.log(window.parseInt("11A"));
}
demo();
2局部作用域
局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所以在一些地方会把这种作用域成为函数作用域。
总结:在一个执行环境内,内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部函数内的所有变量和函数,这些环境之间的联系是线性、有次序的。每个环境都可以向上搜索所用域链,以查询变量和函数名;但是任何环境都不能向下搜索作用域链而进入另一个执行环境。