標籤:使用者 使用者資訊 代碼 注意 混淆 for asc 全域變數 數學
變數的範圍,是指變數的作用範圍。也就是說,變數只在特定範圍有效,超出該範圍無效。
在JavaScript中,有兩種變數,全域變數和局部變數:
- 全域變數:可以在指令碼中的任何位置被調用,全域變數的範圍是當前文檔中整個指令碼地區。
- 局部變數:只能在此變數聲明語句所屬的函數內部使用,局部變數的範圍僅為該函數體。
聲明變數時,要根據編程的目的決定將變數聲明為全域變數還是局部變數。一般而言,儲存全域資訊(如使用者資訊、菜單選項等)的變數需聲明為全域變數,而儲存臨時資訊(如待輸出的格式字串、數學運算中間變數等)的變數則聲明為局部變數。
舉例說明變數範圍
【例2-1】考察如下代碼:
- <html>
- <head>
- <title>局部變數和全域變數</title>
- </head>
- <body>
- <script type="text/javascript">
- var total=100; //全域變數
- function add(num){
- var total; // 局部變數
- total=2*num;
- return total;
- }
- </script>
- <p onclick="alert(add(100));">顯示局部變數</p>
- <p onclick="alert(total);">顯示全域變數</p>
- </body>
- </html>
儲存並運行代碼,點擊第一段文本,顯示 200;點擊第二段文本,顯示 100。
分析:點擊第一段文本,運行add()函數,對total變數賦值。這時,JavaScript會尋找total變數,如果在函數內部找到,就賦值;找不到,就到函數外部尋找。顯然,在函數內部已經找到,賦值後它的值為200。這裡的total變數就是局部變數。
點擊第二段文本,JavaScript會在全域內尋找total變數,如果找到,就返回它的值;找不到,將會引發錯誤。顯然,已經找到,它的值是100。這裡的total變數就是全域變數。
可以發現,在add()函數內部對total變數賦值,並未影響外部的total變數。
【例2-2】對【例2-1】稍作修改,去掉add()函數內部對total變數的聲明。如下所示:
- <html>
- <head>
- <title>局部變數和全域變數</title>
- </head>
- <body>
- <script type="text/javascript">
- var total=100; //全域變數
- function add(num){
- total=2*num;
- return total;
- }
- </script>
- <p onclick="alert(add(100));">這已不是局部變數</p>
- <p onclick="alert(total);">顯示全域變數</p>
- </body>
- </html>
儲存並運行代碼,點擊兩段文本,都顯示 200 。
上述結果表明,JavaScript在add()函數內部沒有找到total變數,又到函數外部尋找,找到後對它賦值,覆蓋掉了原來的值。
說明:JavaScript是從小範圍到大範圍尋找變數的。如果在當前範圍內沒有找到相應的變數,就會一級一級向上級範圍去尋找,找到後,就對它進行操作,找不到將會引發錯誤。
注意:任何情況下,JavaScript絕對不會從大範圍向小範圍尋找變數。如果在函數外部沒有找到變數,絕對不會去函數內部尋找。
在函數內部聲明全域變數
前面已經講到,聲明變數時要使用 var 關鍵字;但是,也可以不使用。
無論在函數外部還是內部,不使用 var 關鍵字聲明的變數都為全域變數。
這就給我們提供了兩種聲明全域變數的方法:
- 在函數外部使用 var 關鍵字聲明;
- 在任何地方不使用 var 關鍵字聲明。
【例2-3】對【例2-2】稍作修改,去掉add()函數外部對total變數的聲明。如下所示:
- <html>
- <head>
- <title>局部變數和全域變數</title>
- </head>
- <body>
- <script type="text/javascript">
- function add(num){
- total=2*num; // total 為全域變數
- return total;
- }
- </script>
- <p onclick="alert(add(100));">這已不是局部變數</p>
- <p onclick="alert(total);">顯示全域變數</p>
- </body>
- </html>
儲存並運行代碼,點擊兩段文本,都顯示 200 。
上述結果表明,在add()函數內部聲明的total變數,已不再是局部變數,它在全域範圍內都是有效。
注意:
- 聲明變數時請盡量使用 var 關鍵字,這對程式結構有很大的協助。
- 盡量不要在函數內部聲明全域變數,也不要在函數內部和外部聲明同名變數,這兩種情況都會造成變數的混淆。
只有在函數內使用 var 關鍵字聲明的變數為局部變數
這裡需要強調的是,只有在函數內部使用 var 關鍵字聲明的變數才是局部變數,在其它“語句塊”內使用 var 關鍵字聲明變數一般是全域變數,if...else...選擇結構和for迴圈結構都是如此。
【例2-4】在for迴圈內部聲明變數。
- <html>
- <head>
- <title>在for迴圈內部聲明變數</title>
- </head>
- <body>
- <script type="text/javascript">
- for(var i=0;i<=5;i++){
- var x=100;
- }
- </script>
- <p onclick="alert(i);">顯示 i 變數的值</p>
- <p onclick="alert(x);">顯示 x 變數的值</p>
- </body>
- </html>
點擊第一段文本,顯示 6 ;點擊第二段文本,顯示 100 。
上述結果表明,在for迴圈內部聲明的 i 和 x 並不是局部變數,而是全域變數。
總結:除了函數,JavaScript是沒有塊級範圍的。
JS 變數的範圍