一些好玩的片段
作者:yaya | 时间:2009年11月30日 | 分类 学海无涯 | 标签 作用域 var | 2回复
今天写个小玩意,涉及到了以下的一些东西。猜猜下面各个程序片段运行弹出a的对话框是多少呢?
代码1
-
var a;
-
for (var i=0;i<2;i++)
-
{
-
if (i==0)
-
{
-
a=100;
-
}
-
else
-
{
-
alert(a);
-
}
-
}
代码2
-
for (var i=0;i<2;i++)
-
{
-
if (i==0)
-
{
-
a=100;
-
}
-
else
-
{
-
alert(a);
-
var a = i;
-
}
-
}
代码3
-
for (var i=0;i<2;i++)
-
{
-
if (i==0)
-
{
-
a=100;
-
}
-
else
-
{
-
alert(a);
-
}
-
var a = i;
-
}
代码4
-
for (var i=0;i<2;i++)
-
{
-
if (i==0)
-
{
-
a=100;
-
}
-
else
-
{
-
var a = i;
-
alert(a);
-
}
-
}
代码5
-
for (var i=0;i<2;i++)
-
{
-
var a;
-
if (i==0)
-
{
-
a=100;
-
}
-
else
-
{
-
alert(a);
-
}
-
}
其实只要知道了以下即可:
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条回复