关于js作用域

 <script></script>是一个域,如果页面中存在多个域,在页面中会一个域一个域的处理,并且会自上而下解析,如果变量在上面一个域中,下面的域中可以读到这个变量;

例一:

alert(a); // function a() {alert(4);}

var a=1;

alert(a); //1

function 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');

}//

}

原文地址:https://www.cnblogs.com/hilxj/p/7482636.html