JavaScript的全局变量与局部变量解析

一、JavaScript scope 的划分标准是function函数块,不是以 if、while、for来划分的

<script>
function f1(){
     alert("before for scope:"+i);       
 //i未赋值(并不是没有声明!使用未声明变量或函数会导致致命错误从而中断脚本执行)
 //此时i值为undefined
      forvar i=0; i<3;i++){
             alert("in for scope:"+i);}
  //i的值是0,1,2    
      alert(“after for scope:”+1);
   //i的值是3,此时已经在for scope之外,但i的值仍然保留为3
       whiletrue){
              var j=1;
              break;}
       alert(j);
   //j的值是1,此时已经在while scope之外,但j的值仍然保留为1
       iftrue){
           var k=1;
       }
       alert(k);
   //k的值为1,此时已经在if scope之外,但k的值仍保留为1
}
f1();
//此时在函数块外调用函数,再次输出存在于f1这个function scope里的i j k变量
alert(i);
//error!!!原因是这里的i未声明(不是未赋值,区别f1的第一行输出),脚本错误,程序结束!
alert(j);       
//未执行
alert(k);
//未执行
</script>

二、JavaScript在执行之前会对整个脚本文件进行预编译(对脚本文件的声明部分做分析,包括局部变量部分),从而确定实变量的作用域。举个例子在下边:

<script>
     var x=1;
     function f2(){
        alert(x);
      //x的值为undefined!这个x并不是全局变量,因为在function scope已经又声明了一个重名的局部变量,所以全局变量的参数a被覆盖了。
说明了JavaScript在执行前会进行预编译,函数体内的x就被指向局部变量,而不是全局变量。此时x只有声明,没有赋值,所以为undefined
x=3; alert(x); //x值为3.但还是局部变量 var x; //局部变量x在这里声明 alert(x); //值为3 } f2(); alert(x); //x值为1,并不是在function scope内,x的值为全局变量的值。 </script>

三、当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope,而当全局变量遇上局部变量时,

  怎样使用全局变量呢?用window.globalVariableName

 

<script>
      var  a=1;
       function f3(){
              alert(window.a);
    //a位1,这里的a是全局变量
              var  a=2;
               alert(a);
           }
       f3();
       alert(a);
</script>

 

posted @ 2016-03-25 15:52  谦一  阅读(755)  评论(0编辑  收藏  举报