关于js作用域
<script></script>是一个域,如果页面中存在多个域,在页面中会一个域一个域的处理,并且会自上而下解析,如果变量在上面一个域中,下面的域中可以读到这个变量;
例一:
alert(a); // function a() {alert(4);}
var a=1;
alert(a); //1function a() {alert(2);}
alert(a); //1
var a=3;
alert(a); //3
function a() {alert(4);}
alert(a); //3
a();不会调用function a() {alert(2);}或者 function a() {alert(4);},因为预解析仓库中没有任何函数了,最终的是a=3,所以a()相当于3();
例二:函数也是一个域(同样有先预解析,再逐行执行代码)
var a=1;
function fn1() {
alert(a); //...
var a=2; 函数自身的域中解析出a=...未定义
}
fn1();
alert(a); //1
例三:
var a=1;
function fn1() {
alert(a); // 1 函数内部在预解析的时候没有找到任何变量,之后就会从子集作用域返回到父级作用域找,
a=2; //此处的a有能力改变外部的变量var a=1;
}
fn1();
alert(a); // 2
例四:
var a=1;
function fn1(a) { //fn1(a)是一个局部变量,是一个空的值a=...
alert(a); // ...
a=2; // a =2 没有改变外部变量var a=1
}
fn1();
alert(a); // 2
例五:
1 var a=1;
function fn1(var a=1:这里有下面fn1(a)传进来的参数a,此时的a来自全局变量 var a =1){
alert(a); //1
a =2; a就近原则 找到局部的变量 并改为2
}
fn1(a);alert(a); //1
例六:内部怎么访问外部变量,想要获取函数内部的值,有两个方案;
方案1
var str =''; //var str =大鸡腿~'';
function fn1(){
var a ='大鸡腿~';
str =a;
}
fn1();
alert(str);
方案2
function fn2(){
var a ='1223333;
fn3(a);
}
fn2(); //先预解析,然后解读代码,执行到fn3(a)的时候,在内部找不到fn3 然后去父级找fn3,找到之后可以把变量传进去,也就是说在函数fn2内部可以调用外部函数fn3,并且传进参数。
function fn3(a){
alert(a); //1223333
}
例六:
alert(a);
if() {
var a=1;
} 不是一个作用域 是一个通透的,var a=1放在里面和外面是一样的,
ps:
alert(fn1); //FF不能对下面的函数进行预解析,所以要想定义全局的函数或变量,尽量不要在if等语句中定义,这样会出现浏览器不兼容。
if() {
var a=1;
function fn2(){
alert('123');
}//
}