首頁 > web前端 > js教程 > 主體

javascript中局部變數和全域變數如何使用及它們的差異是什麼?

伊谢尔伦
發布: 2017-07-18 09:50:10
原創
2310 人瀏覽過

javascript有兩種變數:局部變數和全域變數。

首先,局部變數是指只能在本變數宣告的函數內部呼叫。全域變數時整個程式碼中都可以呼叫的變數。當然,單單從字面上理解肯定是不清楚的,下面我詳細的介紹下:
大家都知道,變數是需要用var關鍵字聲明的。但是javascript中也可以隱式的使用變量,就是不用聲明,直接使用。而且,千萬注意,javascript把隱式宣告的變數總是當成全域變數來使用的。
例如:

function myName() {
 i = 'yuanjianhang';
}
myName();
function sayName() {
 alert(i);
}
sayName();
登入後複製
登入後複製

輸出結果為:yuanjianhang

這表示變數i就是一個全域的變量,如果把上面的程式碼改成如下:

function myName() {
 var i='yuanjianhang';
}
myName();
function sayName() {
 alert(i);
}
sayName();
登入後複製

此時,遊覽器將沒有任何輸出結果,因為i 是在函數myName中定義的,所以它只是myName的局部變量,不可能被外部呼叫。


現在再回過頭來看下面的程式碼:

function myName() {
 i = 'yuanjianhang';
}
myName();
function sayName() {
 alert(i);
}
sayName();
登入後複製
登入後複製

現在,我們進行一下改動,把myName();去掉,程式碼如下:

function myName() {
 i = 'yuanjianhang';
}
function sayName() {
 alert(i);
}
sayName();
登入後複製

#此時,遊覽器也不會有如何反應。因為雖然i是全域變量,但是函數myName()並沒有被調用,所以就等於雖然聲明了i,但是並沒有給i賦予任何的值,所以沒有任何輸出。
同理,如果把上例改成:

function myName() {
 
 i = 'yuanjianhang';
}
function sayName() {
 alert(i);
}
sayName();
myName();
登入後複製

這種情況下還是不會輸出任何結果,javascript程式碼的執行時從上到下的,在sayName()函數被呼叫時會檢查變數i的值,此時函數myName尚未執行,也就是說i還沒有被賦值,所以不會輸出任何結果。

JavaScript scope 的分割標準是function函數區塊,不是以if、while、for來分割的 

<script>
function f1(){
   alert("before for scope:"+i);   
 //i未赋值(并不是没有声明!使用未声明变量或函数会导致致命错误从而中断脚本执行)
 //此时i值为undefined
   for(var 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
    while(true){
       var j=1;
       break;}
    alert(j);
  //j的值是1,此时已经在while scope之外,但j的值仍然保留为1
    if(true){
      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>
登入後複製

以上是javascript中局部變數和全域變數如何使用及它們的差異是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板