在做慕課的javascript的教程時,遇到了一些關於 var 的問題。 一個是對於函數中變數聲明的問題,發現不論用不用 var聲明(req1丶req2丶sumq),程式都可以正常運行。代碼如下: 有點困惑,網上搜了下,看了下書。《javascript語言精粹》中提到:直接使用未經聲明的變數,這被稱 ...
在做慕課的javascript的教程時,遇到了一些關於 var 的問題。
一個是對於函數中變數聲明的問題,發現不論用不用 var聲明(req1丶req2丶sumq),程式都可以正常運行。代碼如下:
1 <script >
2 function app2(x,y)
3 { var sum,x,y;
4 sum = x * y;
5 return sum ;
6 }
7 req1 = app2(5,6); //var req1 = app2(5,6);
8 req2 = app2(2,3); //var req2 = app2(2,3);
9 sumq = req1 + req2; //var sumq = req1 + req2;
10 document.write("req1的值:"+req1+"<br/>");
11 document.write("req2的值:"+req2+"<br/>");
12 document.write(req1+"與"+req2+"和:"+sumq);
13 </script>
有點困惑,網上搜了下,看了下書。《javascript語言精粹》中提到:直接使用未經聲明的變數,這被稱為隱式的全局變數。這種方式本來是為方便初學者的,有意讓變數在使用前無須聲明。但是,忘記聲明變數成了一個非常普遍的錯誤。javascript的策略是讓那些忘記預先聲明的變數成為全局變數,但是這可能會導致bug非常難找。所以應該避免使用全局變數。
還有一個困惑也是和 var 有關的,也是慕課上的。代碼如下:
1 <!-- 要創建一個運行於無窮迴圈中的計數器,我們需要編寫一個函數來調用其自身。在下麵的代碼, 2 點擊Start按鈕,從0開始計數;點擊Stop按鈕,停止計數。 --> 3 <!DOCTYPE HTML> 4 <html> 5 <head> 6 <meta charset="utf-8"> 7 <script type="text/javascript"> 8 var num=0; 9 var i; //不聲明,不會顯示錯誤。. 10 function numCount(){ 11 document.getElementById('txt').value=num; 12 num=num+1; 13 i = setTimeout("numCount()",1000); //若為var i ...,則錯誤。 14 } 15 function stopCount() { 16 clearTimeout(i); 17 } 18 </script> 19 </head> 20 <body> 21 <form> 22 <input type="text" id="txt" /> 23 <input type="button" value="Start" onClick="numCount()" /> 24 <input type="button" value="Stop" onClick="stopCount()" /> 25 </form> 26 </body> 27 </html>
上面的代碼是正確的,可以正常運行。但當刪掉第9行代碼(var i;)時,程式仍然可以正常運行,問題和上面提到的是一樣的:直接使用未聲明的變數時,這個變數就會成為全局變數,所以運行正確。但當第13代碼變為:
var i = setTimeout("numCount()",1000);
時,無論刪除不刪除第9行代碼,程式運行都是錯誤的。這是因為:在函數作用域內,加 var 聲明的變數是局部變數,不加 var 聲明的就成了全局變數。所以用var 聲明之後,變數 i 就是局部變數,所以會導致程式錯誤。
還有在全局作用域下,使用 var 定義的變數不可以 delete,沒有 var 定義的變數可以 delete 。也就是說:隱式全局變數嚴格來說不是真正的變數,而是全局對象的屬性,因為 屬性可以通過 delete 刪除,而變數不可以。