标签:txt java cli script 就会 asc cti div art
在做慕课的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 删除,而变量不可以。
标签:txt java cli script 就会 asc cti div art
原文地址:http://www.cnblogs.com/wangmengjun/p/7066808.html