脚本提高课第二讲;再谈变量
第二讲 再谈变量
===================
一 动态变量与静态变量
===================
动作脚本是一种动态类型化语言。每个变量都有一种类型。该类型是在运行时分配的,并且可以在执行过程中进行更改。这一点与静态类型化语言(如 Java 或 C++)不同,在静态类型化语言中,在编译时分配类型,而且在运行时无法更改。
所谓动态变量指的是一种临时变量,只有执行与该变量相关的一段代码时他才存在,执行完成后内存就释放,特点是变量类型随着变量的赋值而改变.如果变量没有被赋值则系统默认为null或者undefind类型.所谓静态变量指的是,变量存在于整个程序的生命周期中,通常只被某个函数所访问.
动态变量的特点
1 对于未能赋值的变量默认其值为undefined。
例1
on (release) {
var a;
trace(a);//undefined
}
2 undefined可以进行字符串运算不能进行数值运算。
例2
on (release) {
trace(a+"2");//undefined2
trace(a+2);//NaN
}
3 变量类型随着变量的赋值而改变。
例3
on (release) {
var a = 1;
trace(typeof (a));//number
a = "1";
trace(typeof (a));//string
}
===================
二 原始型变量与引用型变量
===================
在前面的课中,我们知道变量的类型有下列几种:字符串、数字、布尔值、对象、影片剪辑、函数、空值和未定义.也就是说一个变量,如果它保存的数据是"字符串",则这个变量就是字符串类型的,如果它保存的是一个影片剪辑,则这个变量就是MovieClip类型的.特别强调的是,保存MovieClip数据的变量名通常用"mc"或"my_mc"表示.
在以上变量类型中,按照其应用特性可以分为:原始变量类型和引用变量类型。原始变量类型是指字符串、数字和布尔值,它们都有一个常数值,因此可以包含它们所代表的元素的实际值。引用变量类型是指影片剪辑和对象,它们的值可能发生更改,因此它们包含对该元素的实际值的引用。
引用变量类型的数据包涵大量复杂信息,此类型变量并不包涵实际的值,它所包含的是对其数据的引用,这种引用类似于指向变量内容的一个别名,当这个变量需要知道它的值时,该引用会查询其内容,然后返回其答案.
原始变量类型与引用变量类型比较
1 原始变量类型返回它所包含的实际值
例4
on (release) {
var a = 5;
trace(a);//5
}
2 引用变量类型返回对该变量的引用
例5
on (release) {
trace(this.mc);//_level0.mc
}
3 引用变量类型不可以应用赋值运算符
例如:
mc是一个实例名,则mc=5是错误的.
===================
三 为动态变量名赋值
===================
当一个变量的名称不断变化时,用通常的赋值运算符是不能为其赋值的,这是因为动态变量名实质上一个字符串,是一种数据,也就是说它已经不是一个变量了,要对其赋值必需将其转换为变量,其方法是使用set 语句或者数组访问运算符.
1 变量与字符串的区别
我们在时间轴上写如下输出语句:
trace(a1); //undefined
trace("a"+1);//a1
(1)显示undefined,说明a1的确是一个变量.既然a1是变量,那么我们可以为它赋值.如下所示:
a1=0;
语法检查没错误.
(2)显示a1说明"a"+1不是变量而是一个字符串类型的数据.你不能为字符串去赋值,如下所示
"a"+1=0;
语法检查显示:"赋值运算符的左侧必须是变量或属性"。说明"a"+1不是一个变量而是一个数据.
2 为动态变量名赋值
为保存着原始数据类型的动态变量名赋值,可以使用set语句或者[],引用类型的变量是不能赋值的.
例6 使用set语句
set ("a"+1,0);
trace(a1);//0
例7 使用方括号
this["a"+1]=0
trace(a1);
四 获取动态变量名中的值
获取动态变量中的值可以使用[]和eval函数.
例8 使用方括号
第一帧初始化一个变量
i=0;
按钮产生动态的变量名
on (release) {
i++;
this["a"+i] = i//为动态变量名赋值;
b = this["a"+i]//获取动态变量名中的值;
trace(b);
}
例9 eval函数
第一帧初始化一个变量
j=0;
按钮产生动态的变量名
on (release) {
j++;
set("c"+j, j);//为动态变量名赋值;
b = eval("c"+j);//获取动态变量名中的值;
trace(b);
}
可见方括号[]和eval函数的本质就是是将字符串转换为标识符。
回复Comments
{commenttime}{commentauthor}
{CommentUrl}
{commentcontent}