作用域:脚本的有效范围;分为2类:全局和局部
只有函数才有局部,其他的没有 for if
全局:
1、在script标签下面的变量函数 ===>全局作用域
2、直接定义在script标签下的变量称为全局变量,函数称为全局函数
3、全局变量及函数都是window的一个属性,才能通过window.变量访问;
例:
<script>
var a = 123;
alert( window.a );//弹出123
function ab(){}
alert( window.ab );//弹出function ab(){};
<script>
局部:
一个function就是个单独的域,也就是我们所说的局部,定义在局部变量/函数叫做局部变量 局部函数
function fn(){
var a = 10;
alert( window.a ) ===>弹出undefined;
}
fn();
这里的a是局部的a,不是window下的,window.a访问不到,不是window下的属性,所以是undefined;
<script>
var a = 20;
function fn(){
var a = 10;
alert( window.a );//弹出20 访问的是window下的a
}
fn();
</script>
局部作用域里面,如果有函数产生并执行,那么在局部作用域里面会产生新的局部作用域;
全局里有多个局部,局部只可以有多个局部;全局与局部变量怎么访问;
作用域链
1、子作用域在使用变量/函数的时候首先会从自身找(当前这一层),当自身能找到应用自己的,如果找不到会向上一层找。
2、所有的儿子可以访问到各个父级(爸爸、爷爷....)
子作用域:二是一的子作用域(父子作用域)
例:
var a = 20;
function fn(){
function x(){
a ++;
}
x();
alert ( a ); //当层没有a会向上找,找到a = 20; a++; a=21会返回给全局的a
} //弹出 21
fn();
某些时,不太确定某一个全局变量是否存在的时候,又要去使用的话,我们可以通过window.的形式,这样就不会报错,不会阻碍后面代码的执行;
例:
var a = 10; var a = 10;
alert( b ); 报错 alert(window.b)===>undefined 后面的代码会执行
alert( b ); 不执行 alert(1);
当定义变量的时候,如果不加var而直接赋值的话(变量 = xxx;),无论全局还是局部相当于window.变量 = xxx的形式;
例:
一、
<script> <script>
a = 10; 相当于window.a = 10; function fn(){
alert( window.a ) a = 0; ===>没有加var 相当于window.a
</script> }
</script>
函数参数的作用域
function a( x , y ){
alert( x ); //弹出5;
var x = 10;
}
a( 5 , 10 );
优先处理参数
相当于
function a( ){
var x = 5; //这都在最前面定义的
var y = 10;
alert( x ); //弹出5;
var x = 10;
}
a( );
网友评论