本文共 1131 字,大约阅读时间需要 3 分钟。
在写as3时有时因为会遇到些似乎不符合常理的错误而抓狂,读了第 F 维空间现在看来都是因为不够了解她所造成的。
在as3的文档中明确写出了变量的作用域,与C和Java不同的是,在as3中没有代码块级别的作用域(block-level scope),举个例子:for (var i = 0; i<5; i ++) {
trace(i); // 显示0-4 } trace(i); // 显示5而不是undefined在C和Java中使用大括号包括起来的代码块也是一个变量作用域,那么上面这段代码在C和Java中第四行在编译执行中就会出错,但是在as3中不存在代码块这个级别的变量作用域,所以即使在for循环内部定义了一个变量在循环外也还会继续存在,所以上面这段代码第四行在as3中会正确的显示成为5而不是undefined。因此下面这段代码编译运行时会出现声明冲突的错误:
for(var i = 0; i < 5; i ++) {}
for(var i = 0; i < 5; i ++) {} // 变量i声明冲突,重复声明错误 呵呵,各位用惯了as2的是不是觉得这里很抓狂。。。。另外在as3中还有一个更有意思的事情,因为as中的一种叫做hoisting的技术实现机制使得编译器在编译时会自动把一个函数中所有变量的声明挪到函数最顶端,所以即使你在一个变量被声明之前调用它甚至赋值都是可以的,举个例子:
trace(num); // 显示NaN(not a number)而不是undefined
var num:Number = 10; // 这里变量才被声明 trace(num); // 显示10 上面这个例子可以看到,在num这个变量被声明之前执行trace(num)会显示num这个变量是Number类型的默认值:NaN而不是未定义错误,这就是因为编译器编译时自动把第二行的变量声明挪到了最前面导致的。甚至你可以在变量声明之前进行赋值:num = 5;
trace(num); // 显示5 var num:Number = 10; trace(num); // 显示10 因此在使用变量的时候一定要小心,要尽量养成先赋值再使用的习惯,或者向C语法一样将所有的赋值语句都置于函数最顶端,并且尽量在声明变量时显式的指定变量的类型。例如下面这个例子就是一个会发生错误的情况:tmp = "Hello!"; // 在编译时会发生类型无法转换的错误,因为后面声明tmp为Number而不是String型
trace(tmp); var tmp:Number = 10; // 声明tmp变量为Number型 trace(tmp);转载地址:http://uhjsi.baihongyu.com/