javascript中的var浅析

时间:2021-12-31 14:47:51

对var不是很理解,就上网查了查,很多都是这个例子,说看了例子就理解了,但是看了半天还是不懂。例子如下:

例一:

 1 <script language="javascript">
 2 var var00 = 0;
 3 document.write(var00 + '<br>');
 4 
 5 var var01 = 1;
 6 function foo()
 7 {
 8     document.write(var01); 
 9     var var01 = 1;
10 }
11 foo();
12 </script>

例二:

<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');

var01 = 1;
function foo()
{
    document.write(var01); 
    var01 = 1;
}
foo();
</script>

例三:

<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');

var01 = 1;
function foo()
{
    document.write(var01); 
    var var01 = 1;
}
foo();
</script>

输出的结果:

1:0、undefined

2:0、1

3:0、undefined

原文中的解释如下:

  原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量。而第一个第三的函数外全局变量,确实说明var关键字有没有都没有关系。而函数内的var关键字就很关键了,它说明第二个var01是函数内的变量,所以在初始化var01前输出自然就是'undefined'了。
     那么函数里面是不是就屏蔽掉了全局的var01了呢?我们知道在C/C++可以使用::去访问全局变量,那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东西,就好弄了。原来全局变量都是动态添加到Window对象的实例window上的属性而以,所以我们只要在函数内用:document.write(window.var01);就可以取到其值1了。同时在这个上下文中,function内的this也是指向的window实例,我们也可以把引用写成:this.var01。

但是反正我看了还是不太明白,为什么第一个例子和第三个例子中的var01不能先取全局变量来输出1,然后才定义赋值给局部变量var01.最后了解到:其实函数内的变量都是先定义,后赋值的,不管定义变量的语句写在何处。而且要明白,在函数外面定义变量的时候,有没有var都无所谓,在函数内部定义变量,如果前面有var就代表是函数内的局部变量,否则为调用全局变量。比如, 

 1 function foo() 
 2 { 
 3 document.write(var01); 
 4 var var01=1; 
 5 document.write(var02); 
 6 var var02=2; 
 7 } 
 8 该函数等价于: 
 9 function foo() 
10 { 
11 var var01; 
12 var var02; 
13 document.write(var01); 
14 var01 = 1; 
15 document.write(var02); 
16 var02 =2; 
17 } 

如此,一下子恍然大悟。所以在执行document.write(var01)时,变量只是定义了,而没有被赋值,所以输出undefined. 将函数改为:

 1  var var00 = 0;
 2  document.write(var00 + '<br>');
 3   
 4  var var01 = 1;
 5  function foo()
 6  {
 7      var var01 = 2;
 8      document.write(var01); 
 9  }
10 foo();

输出结果就为:0、2,说明在函数内部是定义后马上赋值,在document.write调用之前就赋值了,所以显示为局部变量的值为2。