首页 > 代码库 > 关于 var

关于 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>

  有点困惑,网上搜了下,看了下书。《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=http://www.mamicode.com/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="http://www.mamicode.com/Start" onClick="numCount()" />
24           <input type="button" value="http://www.mamicode.com/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