JavaScript 聲明全局變量和局部變量


JS中聲明全局變量主要分為顯式聲明或者隱式聲明下面分別介紹。

聲明方式一:

使用var(關鍵字)+變量名(標識符)的方式在function外部聲明,即為全局變量,否則在function聲明的是局部變量。該方式即為顯式聲明詳細如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
<script>
  var test = 5;//全局變量
  function a(){
    var a = 3;//局部變量
    alert(a);
  }
  function b(){
    alert(test);
  }
  //a();//調用a方法,那么方法里面的內容才會執行
  //b();//同上
</script>

聲明方式二:

沒有使用var,直接給標識符test賦值,這樣會隱式的聲明了全局變量test。即使該語句是在一個function內,當該function被執行后test變成了全局變量。

?
1
2
3
4
5
6
7
8
9
<script>
    test = 5;//全局變量
    function a(){
      aa = 3;//也是全局變量
      alert(test);
    }
    //a();  //輸出5
    //alert(aa);//這里也可以方法a()方法里面的變量,因為aa是全局變量
  </script>

聲明方式三:

使用window全局對象來聲明,全局對象的屬性對應也是全局變量,詳細如下:

?
1
2
3
4
<script>
  window.test = 50;
  alert(test);//輸出50
</script>

這種方式經常被用到一個匿名函數執行后將一些函數公開到全局。 如JQuery1.5中最末一句
代碼如下:

?
1
window.jQuery = window.$ = jQuery;

全局變量的優點:

可以減少變量的個數,減少由於實際參數和形式參數的數據傳遞帶來的時間消耗。

全局變量的缺點:

(1)全局變量保存在靜態存貯區,程序開始運行時為其分配內存,程序結束釋放該內存。與局部變量的動態分配、動態釋放相比,生存期比較長,因此過多的全局變量會占用較多的內存單元。

(2)全局變量破壞了函數的封裝性能。函數象一個黑匣子,一般是通過函數參數和返回值進行輸入輸出,函數內部實現相對獨立。但函數中如果使用了全局變量,那么函數體內的語句就可以繞過函數參數和返回值進行存取,這種情況破壞了函數的獨立性,使函數對全局變量產生依賴。同時,也降低了該函數的可移植性。

(3)全局變量使函數的代碼可讀性降低。由於多個函數都可能使用全局變量,函數執行時全局變量的值可能隨時發生變化,對於程序的查錯和調試都非常不利。
因此,如果不是萬不得已,最好不要使用全局變量。

JS中最經典的全局變量和局部變量問題

話不多說,直接上例子:

  一、Javascript的變量的scope是根據方法塊來划分的(也就是說以function的一對大括號{ }來划分)。切記,是function塊,而for、while、if塊並不是作用域的划分標准,可以看看以下幾個例子:

 

[javascript] view plain copy
  1. <script>  
  2. function test2(){  
  3.     alert ("before for scope:"+i);    // i未賦值(並不是未聲明!使用未聲明的變量或函數全拋出致命錯誤而中斷腳本執行)  
  4.   
  5.                                                     // 此時i的值是underfined  
  6.     for(var i=0;i<3;i++){  
  7.         alert("in for scope:"+i);  // i的值是 0、1、2, 當i為3時跳出循環  
  8.     }  
  9.     alert("after for scope:"+i);  // i的值是3,注意,此時已經在for scope以外,但i的值仍然保留為3  
  10.       
  11.     while(true){  
  12.         var j = 1;  
  13.         break;  
  14.     }  
  15.     alert(j);    // j的值是1,注意,此時已經在while scope以外,但j的值仍然保留為1  
  16.   
  17.     if(true){  
  18.         var k = 1;  
  19.     }  
  20.     alert(k);  //k的值是1,注意,此時已經在if scope以外,但k的值仍然保留為1  
  21. }  
  22.   
  23. test2();  
  24. //若在此時(function scope之外)再輸出只存在於test2 這個function scope里的 i、j、k變量會發生神馬效果呢?  
  25. alert(i); //error! 沒錯,是error,原因是變量i未聲明(並不是未賦值,區分test2函數的第一行輸出),導致腳本錯誤,程序到此結束!  
  26. alert("這行打印還會輸出嗎?"); //未執行  
  27. alert(j); //未執行  
  28. alert(k); //未執行  
  29. </script>  

        二、Javascript在執行前會先對整個腳本文件的聲明部分做完整分析(包括局部變量),從而確定實變量的作用域。怎么理解呢?看下面一個例子:

[javascript] view plain copy
  1. <script>  
  2.     var a =1;  
  3.     function test(){  
  4.         alert(a); //a為undefined! 這個a並不是全局變量,這是因為在function scope里已經聲明了(函數體倒數第4行)一個重名的局部變量,  
  5.                      //所以全局變量a被覆蓋了,這說明了Javascript在執行前會對整個腳本文件的定義部分做完整分析,所以在函數test()執行前,  
  6.                      //函數體中的變量a就被指向內部的局部變量.而不是指向外部的全局變量. 但這時a只有聲明,還沒賦值,所以輸出undefined。  
  7.         a=4         
  8.         alert(a);  //a為4,沒懸念了吧? 這里的a還是局部變量哦!  
  9.         var a;     //局部變量a在這行聲明  
  10.         alert(a);  //a還是為4,這是因為之前已把4賦給a了  
  11.     }  
  12.     test();  
  13.     alert(a); //a為1,這里並不在function scope內,a的值為全局變量的值  
  14. </script>  

        三,當全局變量跟局部變量重名時,局部變量的scope會覆蓋掉全局變量的scope,當離開局部變量的scope后,又重回到全局變量的scope,而當全局變量遇上局部變量時,怎樣使用全局變量呢?用window.globalVariableName。

[javascript] view plain copy
  1. <script>  
  2.     var a =1;  
  3.     function test(){     
  4.         alert(window.a);  //a為1,這里的a是全局變量哦!  
  5.         var a=2;     //局部變量a在這行定義  
  6.         alert(a);  //a為2,這里的a是局部變量哦!  
  7.     }  
  8.     test();  
  9.     alert(a); //a為1,這里並不在function scope內,a的值為全局變量的值  
  10. </script>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM