1. 程式人生 > >JS全域性變數VAR和THIS--在函式內部,加var是區域性變數,不加是全域性變數

JS全域性變數VAR和THIS--在函式內部,加var是區域性變數,不加是全域性變數

JS全域性變數VAR和THIS

2011-05-23 21:43

很多人都覺得在javascript宣告一個變數,加var和不加var沒有什麼區別,實際上是一個錯誤的觀點,如果在函式外面,也就是說在window區域加不加var確實是一樣,因為都會是全域性變數的效果,而如果在函式內部,加var就是區域性變數,不加是全域性變數。 
function test(){   
  var1 = 2; 
  alert(var1);      
}   
test();   
alert(var1); 
這樣可以顯示為2 
function test(){   
  var var1 = 2; 
  alert(var1);      
}   
test();   
alert(var1); 
則為變數未定義錯誤 

this多用於函式內部,它永遠指向呼叫他的那個物件,看看下面的例子就明白了 

var test={ 
   a:"test", 
   msg:function(){ 
     a="1234"; 
     alert(this.a); 
     var msg1= function(){ 
alert(this.a); 
     } 
     msg1(); 
   } 

test.msg(); 這樣會分別顯示 "test" ,"1234". 

但this也不是這麼簡單,在看看下面的例子 
function test1()   
{   
  this.var01 = "test"; 


function test2()   

  alert(var01); 


var a= new test1(); 
test1(); 
test2(); 
alert(a.var01); 
都可以得到"test". 
可以發現var01變數既是一個全域性變數,又是test1內的成員變數。也就是說,如果在函式內部用this定義的變數,如果這個函式你不是直接來執行,而是作為一個類來new的話,雖然函式也要執行一遍,但裡面的this定義的 變數是作為類的成員變數來定義的,也就是一個區域性變數,上面的測試程式碼,如果去掉test1();  test2()執行就是未定義變數錯誤了。 

說到變數,最後提一下js變數無型別的說法,這個說法本身沒有錯,但js變數無型別,這話很模糊,有的人會理解成js 裡面沒有資料型別。這顯然是錯誤的,js 裡面也有數字,字元,布林,類等資料型別。說變數無型別,指的是剛定義一個變數的時候,這個變數是沒有型別的,當你給它賦值的時候,值是什麼型別,那這個變數就是什麼型別了

——————————————————————————————————————————————————————

例項 - 無窮迴圈

要建立一個運行於無窮迴圈中的計時器,我們需要編寫一個函式來呼叫其自身。在下面的例子中,當按鈕被點選後,輸入域便從 0 開始計數。

<html>

<head>
<script type="text/javascript">
var c=0
var t
function timedCount()
 {
 document.getElementById('txt').value=c
 c=c+1
 t=setTimeout("timedCount()",1000)
} </script> </head> <body> <form> <input type="button" value="Start count!" onClick="timedCount()"> <input type="text" id="txt"> </form> </body> </html>