在ActionScript中变量不需要声明,但是,声明变量是良好的编程风格,这便于掌握一个变量的生命周期,明确知道某一个变量的意义,有利于程序的调试。通常,在动画的第一桢就已经声明了大部分的全局变量并为它们赋予了初始值。每一个MC对象都拥有自己的一套变量,而且不同MC对象中的变量相互独立且互不影响。
变量名
变量名需符合以下几点:
1) 变量名必须是一个标识符,不能包含任何特殊符号;
2) 变量名不能是关键字及布尔值(true和flase)
3) 变量名在其作用域中唯一。
变量的类型
在Flash中不需要显式的声明一个变量的类型,当变量被赋值的时候,它的类型被动态的确定,当然,也可以把赋值语句理解为变量的声明语句,例如:
x = 3;
上面的表达式声明了一个x变量,其类型为number类型,并且x的值为3。对变量x的赋值可能还会改变它的数据类型:
x = "hello";
此时变量x将从number类型改变为string类型。这同C语言等其他高级语言好像有些不同,但其实Flash中的赋值语句不仅仅是一个赋值功能,它还起到了变量声明的作用。
声明了却没有被赋值的变量类型被称为无类型变量。
在特定的条件下,ActionScript可以自动将变量的类型进行转换。例如,当为trace语句传递一个值以后,这个值被自动转换成字符串类型输出到Output窗口中。在表达式中,ActionScript会根据需要对变量进行类型转换,如下例:
"The number is " + 7
ActionScript将数字7自动转换成字符串"7",并将它添加在前面字符串的末尾:
"The number is 7"
在调试脚本的时候,需要确切掌握一个变量的数据类型,因为数据类型决定了变量的行为,ActionScript中提供了typeof操作符,用于确定某一个变量的类型:
trace( typeof( aVariable ));
另外,Flash 5中提供了两个类型转换函数。Number函数可以将一个字符串转换成数字,相应的,String函数可以将一个数字转换成一个字符串,它们的用法比较简单,在Flash 5的脚本编辑面板中已经提供了充分的提示。
变量的作用域
ActionScript中有局部变量和全局变量之分,全局变量在整个动画的脚本中都有效,而局部变量只在它自己的作用域内有效。声明局部变量需要用到var语句。例如,在下面的例子中,i是一个局部的循环变量,它只在函数init中有效:
function init(){
var i;
for(i=0; i<10; i++){
randomArray[i] = random(100);
}
}
局部变量可以防止名字冲突,而名字冲突可能会导致致命的程序错误。例如,变量n是一个局部变量,它可以用在一个MC对象中计数,而另外一个MC对象中可能也有一个变量n,它可能用作一个循环变量,因为它们有不同的作用域,所以并不会造成任何冲突。
使用局部变量的好处在于减少程序错误发生的可能。比如,一个函数中使用局部变量,那么这个变量只会在函数内部被改变,而一个全局变量可以在整个程序的任何位置被改变,使用错误的变量可能会导致函数返回错误的结果,甚至使整个系统崩溃。
此外,函数的参数也将作为该函数的一个局部变量来使用,例如:
x=3;
function test(x)
{
x=1;
a=x;
}
test(x)
程序执行之后的结果是a=1,x=3。从这个例子可以看出test函数中的x参数的确是作为函数内部的局部变量来处理了。
变量的声明
在程序中,给一个变量直接赋值或者使用setVariables语句赋值就相当于声明了全局变量;局部变量的声明需要用var语句。在一个函数体内用var语句声明变量,该变量就成了这个函数的局部变量,它将在函数执行结束的时候被释放;在根时间轴上使用var语句声明的变量也是全局的,它们在整个动画结束的时候才会被释放掉。
在声明了一个全局变量之后,紧接着再次使用var语句声明该变量,那么,这条var语句无效,例如:
aVariable = 10;
var aVariable;
aVariable += 1;
在上面的脚本中,变量aVariable被重复声明了两次,其中var语句的声明被视为无效,脚本执行后,变量aVariable的值将为11。
注:call语句同样会为它调用的程序块生成一个局部变量作用域,当被调用的脚本结束的时候,这个局部作用域也同时消失。Flash 5中call语句可以用with语句取代。
使用trace语句可以检测变量的值,例如trace(aVariable)将变量aVariable的值转换成字符串传递到Output窗口中,在调试模式下,还可以随时改变和获取某一个变量的值。
变量的使用
在引用一个变量的时候,必须先进行声明(使用var语句或者直接赋值),如果变量没有得到初始化,那么,在下面的例子中,将会产生错误:
gotoAndPlay( aFrame );
其中aFrame是一个标签,因为aFrame没有被声明,gotoAndPlay将会被错误的执行,跳转到一个不确定的位置。
变量的内容可以随时被改变,变量的类型决定了它们的行为。请注意下面一段关于变量类型的说明,其中一些特征是ActionScript中所特有的。
简单数据类型传递的是变量的值,就是说,变量的内容会被拷贝一份之后才被传递出去,不论是在赋值语句中,还是作为参数传递给一个函数都是一样:
var x = 4;
var y = Math.sqrt(x);
上面例子中,变量x的值被复制后传递给sqrt函数,并将返回结果2赋值给变量y,变量x的值保持不变。 对象数据类型包含有大量复杂的信息,具有这种数据类型的变量并不保存对象的实际内容,它们保存的只是一个指向对象的指针,当调用对象的属性或者方法的时候,根据这个指针找到该对象实际的位置并返回所需要的内容。
下面是一个通过指针进行传递的例子:
var myArray = ["Holly", "Tom"];
var newArray = myArray;
myArray[1] = "Marry";
trace(newArray);
上面的例子中,一个数组对象myArray有两个元素,newArray被赋值为指向myArray的指针,当myArray的第二个元素被改变之后,所有指向它的其它变量内容也会改变,最后的trace语句将会把["Marry", "Tom"]输出到输出窗口中。
下面是一个将对象类型的变量作为参数传递给函数的例子:
function initArray(newArray){
var i;
for ( i=0; i<10; i++ ){
newArray[i] = random( 100 );
}
}
var myArray = new Array();
initArray( myArray );
上例中,myArray被传递到函数initArray中,因为传递的是对象指针,所以在函数内,数组myArray将被初始化。
在ActionScript中,对一般对象的引用称为强引用,对MC动画的引用称为弱引用。强引用是指只要还有一个指针指向该对象,那么这个对象就不能被释放;弱引用是指如果MC动画结束之后,所有指向该MC动画的指针将随之而不再有效。