關于 var

  在做慕課的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>

 

  有點困惑,網上搜了下,看了下書?!秊avascript語言精粹》中提到:直接使用未經聲明的變量,這被稱為隱式的全局變量。這種方式本來是為方便初學者的,有意讓變量在使用前無須聲明。但是,忘記聲明變量成了一個非常普遍的錯誤。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 刪除,而變量不可以?! ?/p>

 來源:itnose

上一篇: 微信JS SDK接入的幾點注意事項

下一篇: 實現簡易版的moment.js

分享到: 更多
快乐彩怎么买稳赚不赔 财神计划软件 大乐透中奖规则及奖金 夫人猛料六肖中特 竞彩稳赚不赔模式 投注世界杯 必中万能版计划软件 排五带线走势图专业版 极速时时采彩计划软件 幸运飞艇计划全天计划金鹰 彩名堂免费计划软件下载2.0.6 慈善网一肖中特平网站 看和值判断大小 网上游戏棋牌 牌九玩法图解 麻将怎么胡牌初学者