在做慕課的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 刪除,而變數不可以。
#
以上是關於var用法的總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!