作用域
标识符生效的范围,比如一个变量,这某个范围生效,出来了这个范围就访问不到了。
全局作用域
个script标签或一个js文件中会形成一个区域叫全局作用域,在srcipt标签内的全局作用域中定义的变量是全局变量,在全局作用域内可以访问。
<script>
//全局作用域中的变量
var a = 20;
function a(){
/*
函数也在全局作用域里面
因此函数也可以访问在全局作用域中的变量
*/
console.log(a);
}
</script>
局部作用域
在函数内部也会形成作用域也叫局部作用域,在函数里定义的变量是局部变量,只在函数内部起作用,对外不可见。
function a(){
var p = 20;
}
//报错。p是局部变量只能在函数内起效
console.log(p);
访问标识符符合一个原则,里面的可以访问外面的,不管嵌套多少层都可以访问,外面的就是不能访问里面,换句话说局部作用域是在外部作用域范围内的,站在内部函数的角度考虑,它处在外部环境的内部,所以在函数是可以访问到外部的,而反过来不行。
例子:
以下代码中fn3不光在fn2的环境中也在fn1和全局的环境中,因此可以访问到全局、fn1、fn2、fn3中的变量,而反过来不行。
function fn1(){
var a = 30;
function fn2(){
var b = 20;
function fn3(){
var c = 10;
//60 a、b、c都可以访问到
console.log(a + b + c);
}
fn3()
//报错
console.log(c)
}
fn2();
}
fn2()
作用域链
如果在不同的作用域中有同名的变量该怎么访问?
var a = 0
function fn1(){
var a = 1;
function fn2(){
var a = 2;
//2
console.log(a);
}
fn2();
}
fn1();
结果: 2
标识符查找的规则: 就近原则,当在函数作用域中操作一个变量时,会先从自己的作用域中查找有没有这个标识符,如果有,就使用这个标识符的值,如果没有就去上一层的作用域找这个标识符,直到找到全局作用域为止,如果全局作用域依然没有这个标识符,则抛出错误: test is not defined,这种链式查找关系我们称为作用域链。