#一.作用域
简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
##在JavaScript中,变量的作用域有:
##1.局部作用域
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域
##2.全局作用域
在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:
##3.JavaScript的作用域链
var a = 12;
function test(){
var b = 23;
function test1(){
var c = 45;
alert(a);
}
test1();//调用test1函数
}
test();//调用test()函数
解释:1.alert(a)中的a首先在test1函数里面去找,看有没有定义a这个变量,找到,就使用其中的定义的变量a;
2.如果没找到,则会继续在test中去找,有就使用;
3.如果还是没找到,就会继续向上找(全局对象)查找是否定义了a,找到了就使用.
#作用域链定义
作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。
上面的代码涉及到了三个作用域链对象,依次是:test1、test、window。
*/
##2、函数体内部,局部变量的优先级比同名的全局变量高。
var a1 = 23;
function test3(){
var a1 = 34;
alert(a1);//34
}
##3、JavaScript没有块级作用域。
var a2 = 12;
if(true){
var a3 = 13;
for (var a4 = 12;a4 < 15;a4++) {
console.log(a4);
}
}
//a2,a3,a4作用域是一样的
##4、函数中声明的变量在整个函数中都有定义。
var a5 = 12
function test4(){
var a6 = 100;
function test5(){
a6 = 200;
}
}
//上面得代码说明了,变量a6在整个test4函数体内都可以使用,并可以重新赋值
###这是由于在函数test6内局部变量x在整个函数体内都有定义( var a7= 10000,进行了声明),所以在整个test6函数体内隐藏了同名的全局变量a7。这里之所以会弹出’undefined’是因为,第一个执行alert(x)时,局部变量x仍未被初始化。
var a7 = 100;
function test6(){
alert(a7);
var a7 = 10000;
alert(a7);
}
/*等价于
*function test6(){
var a7;
alert(a7);
a7 = 10000;
alert(a7);
}
##5、未使用var关键字定义的变量都是全局变量。
function test7(){
a8 = 100; //声明了全局变量x并进行赋值
}
alert(a8);
//这也是JavaScript新手常见的错误,无意之中留下的许多全局变量。
##6、全局变量都是window对象的属性
var a9 = 100 ;
alert( window.a9 );//弹出100
alert(a9);
//在<script>
//标签里面,直接定义的变量,就是全局的window对象的变量
//处处可以调用也。