一些好玩的片段

作者:yaya | 时间:2009年11月30日 | 分类 学海无涯 | 标签 作用域 var | 2回复

今天写个小玩意,涉及到了以下的一些东西。猜猜下面各个程序片段运行弹出a的对话框是多少呢?

代码1
  1. var a;
  2. for (var i=0;i<2;i++)
  3. {  
  4.    if (i==0)
  5.    {  
  6.      a=100;
  7.    }
  8.    else
  9.    {      
  10.      alert(a);
  11.    }
  12. }
代码2
  1. for (var i=0;i<2;i++)
  2. {  
  3.    if (i==0)
  4.    {  
  5.      a=100;
  6.    }
  7.    else
  8.    {    
  9.      alert(a);
  10.      var a = i;
  11.    }
  12. }
代码3
  1. for (var i=0;i<2;i++)
  2. {  
  3.    if (i==0)
  4.    {  
  5.      a=100;
  6.    }
  7.    else
  8.    {    
  9.      alert(a);
  10.    }
  11.    var a = i;
  12. }
代码4
  1. for (var i=0;i<2;i++)
  2. {  
  3.    if (i==0)
  4.    {  
  5.      a=100;
  6.    }
  7.    else
  8.    {  
  9.      var a = i;    
  10.      alert(a);
  11.    }
  12. }
代码5
  1. for (var i=0;i<2;i++)
  2. {  
  3.    var a;
  4.    if (i==0)
  5.    {  
  6.      a=100;
  7.    }
  8.    else
  9.    {      
  10.      alert(a);
  11.    }
  12. }

 

其实只要知道了以下即可:

1.由于只有函数定义才会产生新的作用域(当然程序本来就会产生),而块级元素是不会产生的,所以for block自然也不会产生新的作用域。所以就以上代码而言,在for循环里面写var a亦等于写在for循环外,都相当于被定义为全局变量,即添加为global对象成员,对于浏览器宿主而言,就是window对象。

2.变量的声明查找会从其作用域开始进行查找,若没有找到就到上级作用域查找。就是说会从当前的函数块开始查找,找不到就上上级的函数块,找到了最上层还找不到就会报错。这里需要说明的是,如果某个作用域的环境的所有者有prototype属性,则会沿着prototype链去查找下去。

3.变量创建时候就被设置为了undefined,所以未赋值时候为undefined,而未申明则会报错。

4.而至于var的位置可变性,则是javascript进行预编译的结果。也就是说会先分配给内存空间给它,但是呢,并没有赋值,这个时候变量已经创建了。而赋值的操作则是在解释执行的时候了。

通过以上的几点,我们可以很容易得得出,以上几个程序片段的运行结果分别为:100,100,0,1,100

OK。写完收工。

已有2条回复

  1. 我就宁愿当洋芋了 2009年12月1日#1
    我就宁愿当洋芋了
    我突然有点想要认真看你写的这些的冲动

    但是……可唔可以……从初级班开始
  2. 我就宁愿当洋芋了 2009年12月1日#2
    我就宁愿当洋芋了
    我记得这个blog以前不是还有其他人写咩

    咋个现在只剩你了喃