说一说as3中变量声明提升的问题
在网上搜索资料,一次偶然的机会在学习资料库(原快闪论坛)http://mymc.sc.cn/bbs/上看到资深网友“沪上老康” 在题为“跟AS3初学者侃侃编程ABC”帖子上提的一个问题,将以下代码写在时间轴上测试,竟然通过了:
a=3;
trace(a);//输出3
var a=3;
trace(a);//输出3
印象中as3中的变量必须先进行声明,然后才能引用,怎么可能出现这种情况,抱着怀疑的态度,我当场进行了测试,没想到情况果真如此。为了进一步验证“变量必须先进行声明,然后才能引用”这句话,之后又单独对:
a=3;
trace(a);
进行了测试,发现它确实又是报错的。究竟是什么原因?错误肯定存在,为什么不报错,难道说已经出现的错误还有可能在后面会被屏蔽掉了?带着这个问题,我开始了在网上寻找答案……
原来在as3中存在着所谓“变量声明提升”情况,即在as3中会把所有的声明提到函数体的顶部。也就是说你可以使用一个变量,只要这个变量在函数体内被声明过,但不在乎它声明的位置,哪怕是在函数体的结尾。或者可以说,变量是可以先使用再声明的。这是从代码表面来看的,因为内部机制来说,as3会把所有的声明放到函数体的顶部执行,实际上还是先声明再使用的。 如:
function myFunction():void{
trace(num); // NaN
var num:Number=10;
trace(num); //10
}
上面的代码也是合法的。但是第一个trace(num)会生成NaN,这是因为编译器只会提升声明,而不会提升任何赋值语句。第二个trace(num)生成10.你也可以先赋值再声明,如
function myFunction():void{
num=5;
trace(num); //5
var num:Number=10;
}
由此不难理解为什么沪上老康的代码在测试时不会报错,原因是后面的var a=3这句代码对前面的变量a补充进行了声明。