日期:2013-11-14  浏览次数:20677 次

  变量是什么? 大概说来就是存放信息的容器(更确切的说是指向内存空间中某个存贮位置的指针, 不过能够理解就行了, 何必去记这么笼统的定义). 只需能够理解它可以存放信息并可以通过各种途径改变其中的信息就可以了, 我又不是大学里面的老师, 整天就知道叫先生死记硬背定义, 实际的东西一点都没有, "一切为了考试".
还有一个概念: 什么叫初始化变量? 就是在定义时给它一个无效值以说明它的内容和数据类型. 就像下面的例子, 定义了一个字符串(String)变量:
MyString = "我不懂什么是初始化变量";
就这么简单, 但是也有要留意的问题:
变量名必须为无效的标识符(例如不能以数字和不允许使用的字符开头).
变量名不能与 Actions cript 关键字和常量类似或相反.
变量名在它的作用域(Scope)中必须是独一的(在下面我们会提到什么是作用域).
变量作用域
也就是变量在什么范围内是可以访问的. 就好像在 C&C: Renegade 中的任务一样, 没有 Security Level 3 的 ID Card 就进不了安全级别为 3 的区域的.
作用域普通说来有三种: 时间线(Timeline), 局部(Local), 全局(Global).

--------------------------------------------------------------------------------
对于时间线范围的变量, 就像上面的例子一样用 = 赋值并声明, 当然你也可以用 set 动作(Flash 4, 不推荐使用的方法, 除非你觉得代码不够长):
set( MyString, "我不懂什么是初始化变量" );
时间线范围变量声明后, 在声明它的整个层级(Level)的时间线内它是可访问的.

--------------------------------------------------------------------------------
什么是局部变量? 我也常常问本人. 局部变量就是在声明它的语句块内(例如一个函数体)是可访问的变量, 通常是为避免冲突和节省内存占用而使用.
声明它可以使用 var 关键字:
function LocalVar(){
var MyLocalString = "这是一个局部字符串变量";
trace( "Inside: " + MyLocalString );
}
LocalVar();
trace( "Outside: " + MyLocalString );
上面的 MyLocalString 字符串变量在函数尾就会被自动清除出内存. 所以在外面的 trace 语句前往结果为空("Outside:"), 而函数体内的 trace 前往:"Inside: 这是一个局部字符串变量".
假如你删除了 var 关键字, 那么 MyLocalString 就成时间线范围的变量了. 运转后显示 Inside 和 Outside 都为 "这是一个局部字符串变量". 在后面的函数一章我们还会提到局部变量的内容.
也许你留意到了函数中有一个 trace 动作. 它可以在测试模式(Testing Movie, CTRL+ENTER 组合键)下把指定变量的值发送到输出窗口(Output Window), 以便在运转时检查处理变量的代码能否正常. 这是一个非常方便的检查方法, 在测试代码时经常使用.
在代码中如果遇到有不清楚的函数和关键字, 可以通过 Action 面板的参考按钮(Reference)打开参考面板显示光标所在位置关键字或内建函数以及对象的详细信息, 也可以通过组合键 SHIFT+F1 打开它. 下面是参考面板:
全局变量, 顾名思义就是在整个 Movie 中都可以访问的变量. 它的声明比较特殊:
_global.MyGlobalString = "这是一个全局字符串变量";
声明使用了一个 _global 标识符和点语法(Dot Syntax, 将在后面的章节讨论). _global 标识符是在 Flash 6 中新添加的, 用于创建全局变量, 函数, 对象和类(Class, 不清楚类是什么的话可以看看 C++ 的书).
总的来说 _global 是一个与最底层 _level0 并列的对象. 所有的全局变量, 函数, 对象其实就相当于是它的属性, 方法, 子对象. 关于它的具体内容可以查阅协助文件, 普通我们只需懂得用就行了.
全局变量会被同名的时间线变量和局部变量屏蔽(Obscured), 这时我们就要通过别的方式来访问它了. 看看下面的例子:
//定义全局变量
_global.x = "Global";
//一个简单的函数
function show() {
trace("没有局部变量时函数内: "+x);
var x = "Local";
trace("有局部变量时函数内: "+x);
trace("有局部变量时调用时间线变量: "+this.x);
}
//测试
trace("------没有时间线范围变量时------");
show();
trace("直接调用: "+x);
//设置时间线变量
x = "Timeline";
//测试
trace("-------有时间线范围变量时-------");
show();
trace("直接调用: "+x);
trace("有时间线范围变量时调用全局变量: "+_global.x);
由上例的结果可以看出, 在当前时间线范围内有和全局变量同名的变量时, 直接通过变量名只能访问时间线范围内的同名变量, 这时应该用 _global.变量名 来调用全局变量. 同样局部变量也会屏蔽时间线变量(这时可以用 this.变量名 来调用时间线变量)和全局变量(这时可以用 _global.变量名 来调用全局变量).
在代码中使用变量
使用变量很简单, 有点编程基础的读者都可以办到. 下面用一个例子来说明在 Actions cript 中变量的使用:
function vars(x){
if(x<5){ //如果 x 小于 1
x = x + 1; //x 加 1
} else {
x = 10; //否则赋值 10
}
trace("x="+x);
return x;
}
vars(2);
vars(6);
trace("x="+x); //测试 x 能否为局部变量
函数声明中的参数无需加 var 声明也自动作为局部变量(例如上面例子中的 x). 通过上面例子的最后一句就可以看出来(前往值为空).
我们可以看到, 上面定义的函数中对局部变量 x (在函数参数中声明)进行了 4 种操作:
赋值: 就是改变变量所存贮的内容.
运算: 使用运算符运算并前往结果. 上例中的 x = x + 1 可视为一个运算操作(x + 1)和一个赋值操作(x = ...)的复合语句. 对于逻辑运算(上面 if 语句的条件), 前往的为逻辑值 true 或 false(就像 x<5 在 x 为 4 时会前往 true).
函数及命令调用: 就如上面 trace("x="+x); 中的一样, x 是被作为参数传递给函数的, 它代表的是它所存贮的实际内容(在 return x; 中也一样).
在 Actions cript 中变量的使器具有很大的灵活性, 下面我们将会针对不同的数据类型进行讲解.
常见数据类型---字符串 | String
一个字符串就是一系列的字符, 例如 "This" 就是一个字符串.
定义一个字符串变量很简单, 只需在初始化时将一个字符串数据赋给它就行了:
chapter = "第 2 章";
section = "第 2 节";
section_name = "常见数据类型";
full_name = section + " " add section_name + 999; //连接字符串
if(typeof(full_name) ne "string"){
full_name = "类型错误!";
}
trace("full_name=" + full_name);
上面的第 4 行的 full_name 的值是前面两个变量(section 和 section_name)和一个常量(999)的运算结果(使用了 + 和 add 运算符, 它们的功用是相反的). 请留意, 这行代码最后面的数值常量 999 不是同一类型的数据, 如果在 Pascal