跳转到内容

ActionScript 2.0/控制语句简介

来自维基教科书,自由的教科书
ActionScript 2.0 简介
属性和方法 控制语句 事件处理

关键概念


  • 控制语句
  • 选择语句和条件
  • switch语句
    • default, break;
  • for循环
  • 数组
  • whiledo ... while 循环
  • for ... in 循环
  • 在条件和循环中使用 arguments

有时我们需要多次执行某个操作。有时我们不想在某些情况下执行操作,但在其他情况下却想执行。本章将介绍控制语句,它控制语句的执行方式。

什么是选择语句?

[编辑 | 编辑源代码]

选择语句,也称为条件语句,是一种控制语句,允许你在值为真时执行一个操作,而在值为假时执行另一个操作。确定将执行哪个操作的布尔值称为条件

如何使用if

[编辑 | 编辑源代码]

考虑以下示例

代码 结果
var isHappy:Boolean = true;
if(isHappy){
     trace("I am happy!");
}

我很开心!

在上面的代码中,如果isHappy为真,则会追踪“我很开心!”。如果我们想在isHappy不为真的情况下追踪“我不开心”。

代码 结果
function traceMood():Void{
     if(isHappy){
          trace("I am happy!");
     } else {
          trace("I am unhappy.");
     }
}
var isHappy:Boolean = true;
traceMood();
isHappy = false
traceMood();

我很开心!
我不开心。

在上面的代码中,我们使用else来追踪“我不开心。”如果isHappy为假或为null。如果<现在假设我们想在既不开心也不不开心的时候追踪“还行”。以下是相应的代码

代码 结果
function traceMood():Void{
     if(isHappy){
          trace("I am happy!");
     } else if (isHappy == false){
          trace("I am unhappy.");
     } else {
          trace("Meh.");
     }
}
var isHappy:Boolean;
traceMood();

还行。

在上面的代码中,计算机首先确定isHappy是否为真。由于它不是,它继续执行第二部分。弄清楚isHappy既不是真也不是假,它继续追踪“还行”。请注意,这里不能使用 ! 运算符,因为 !isHappy 仅仅意味着“isHappy 不为真”,这与“isHappy 为假”不同。

总而言之,选择语句的语法如下

if(condition){
     Statements if the first condition is true;
} else if(condition){
     Statements if the second condition is true;
} ...
... else {
     Statements if none of the conditions is true;
}

调用者和被调用者[检查拼写] 经常与选择语句一起使用。以下是一个显示调用者与选择语句结合使用的示例

代码 结果
function someCallee(){
     if(arguments.caller == someCaller){
          someNumber++;
          trace("No, *I* get to say that Hello World line!");
          arguments.caller();
     }
}
function someCaller(){
     trace("Hello world!");
     if(someNumber == 5){
          someCallee();
     }
}
var someNumber:Number = 5;
someCaller();
someCallee();

你好世界!
不,*我*才能说那句你好世界!
你好世界!

在这个例子中,someCaller 被调用并追踪“你好世界!”。由于 someNumber 为 5,它调用 someCallee。someCallee 增加 someNumber,追踪嫉妒的语句,然后再次调用 someCaller。someCaller 然后通过再次追踪“你好世界!”来惹恼 someCallee。但是,由于 someNumber 现在为 6,它不再追踪 someCallee。最后一行什么都不做,因为 someCallee 仅在调用者为 someCaller 时才起作用。这种技术可以避免在非预期区域意外调用函数。

不要试图移除 someCaller 中的选择!如果你这样做,就像有两面镜子互相面对一样,会导致无限循环。我们将在本章后面讨论无限循环。

什么是switch语句?

[编辑 | 编辑源代码]

有时我们有多个条件,为每个条件创建if语句会不可行。在这种情况下,我们可以使用switch语句。语法如下

switch(variable){
     case value:
     Statements in this case;
     break;
     ...
     default:
     Statements if none of the cases are satisfied;
}

看看以下示例,说明正在发生的事情

代码 结果
var today:Number = 5;
switch(today){
     case 1:
     trace("Monday");
     break;
     case 2:
     trace("Tuesday");
     break;
     case 3:
     trace("Wednesday");
     break;
     case 4:
     trace("Thursday");
     break;
     case 5:
     trace("Friday");
     break;
     case 6:
     trace("Saturday");
     break;
     case 7:
     trace("Sunday");
     break;
     default:
     trace("That's not a valid day.");
}

星期五

计算机检测到today = 5 并追踪相应的字符串“星期五”。如果当天为 0 或 8 或任何不为 1-7 的值,Flash 将执行默认操作,即追踪“这不是一个有效的一天”。

请注意,break;语句告诉计算机退出 switch 语句。如果没有包含break;语句,计算机将继续执行其下面的 case 语句。例如

代码 结果
var today:Number = 5;
switch(today){
     case 1:
     trace("Monday");
     case 2:
     trace("Tuesday");
     case 3:
     trace("Wednesday");
     case 4:
     trace("Thursday");
     case 5:
     trace("Friday");
     case 6:
     trace("Saturday");
     case 7:
     trace("Sunday");
}

星期五
星期六
星期日

什么是循环?

[编辑 | 编辑源代码]

有时我们需要多次执行某个操作。这就是循环派上用场的地方。

如何使用for循环?

[编辑 | 编辑源代码]

for 循环有一个名为循环计数器的变量,它会不断变化。当循环计数器不再满足某个条件时,循环将停止。for 循环的语法如下

for(declaration and initialisation of the counter; condition; change in the counter){
    Statement to be repeated;
}

例如

代码 结果
for(var i:Number = 0; i < 10; i += 2){
     trace("Wikibooks is awesome.");
}

维基教科书很棒。
维基教科书很棒。
维基教科书很棒。
维基教科书很棒。
维基教科书很棒。

以下步骤参与其中

  1. i 设置为零。
  2. 由于 0 < 10 为真,计算机追踪该语句。i 增加 2 并变为 2。
  3. 由于 2 < 10 为真,计算机追踪该语句。i 增加 2 并变为 4。
  4. 由于 4 < 10 为真,计算机追踪该语句。i 增加 2 并变为 6。
  5. 由于 6 < 10 为真,计算机追踪该语句。i 增加 2 并变为 8。
  6. 由于 8 < 10 为真,计算机追踪该语句。i 增加 2 并变为 10。
  7. 由于 10 < 10 为假,计算机退出循环。

与 switch 语句一样,也可以使用break;语句退出循环

代码 结果
var someVariable:Number = 3;
for(var i:Number = 0; i < 5; i ++){
     trace("Wikibooks is awesome.");
     someVariable ++;
     if(someVariable > 5){
          break;
     }
}

维基教科书很棒。
维基教科书很棒。
维基教科书很棒。

在这个例子中,循环在 i 等于 5 之前就退出了,因为选择语句退出了循环。

有时我们只想停止循环的迭代,而不是整个循环。我们为此使用 continue 语句

代码 结果
var someVariable:Number = 3;
for(var i:Number = 0; i < 10; i ++){
     trace("someVariable:" + someVariable);
     if(someVariable >= 5){
          continue;
     }
     someVariable++;
}

someVariable:3
someVariable:4
someVariable:5
someVariable:5
someVariable:5
someVariable:5
someVariable:5
someVariable:5
someVariable:5
someVariable:5

在这个例子中,只有当 someVariable 小于 5 时它才会增加。

创建循环时,必须非常小心,不要创建无限循环。无限循环会使应用程序崩溃(警告:不要在家尝试)

代码 结果
var someVariable:Number = 3;
for(var i:Number = 0; i > -1; i ++){
     trace("Wikibooks is awesome.");
     someVariable ++;
     if(someVariable > 5){
          break;
     }
}

应用程序崩溃!

什么是数组?

[编辑 | 编辑源代码]

数组是一个对象,它包含,嗯,一个对象数组。它可以存储几乎任何对象,从数字、布尔值和字符串到 MovieClips、TextFields 和声音。这些对象称为数组元素。有几种方法可以使用数组的构造函数。在本章中,我们只使用没有参数的那个。

代码 结果
var months:Array = new Array();
months[0] = "January";
months[1] = "February";
months[2] = "March";
...
months[11] = "December";
trace(months[0]);

一月

数组元素的位置称为它的索引。索引从 0 开始,而不是 1。我们可以使用语法arrayName[index]访问数组元素。在示例中,我们没有在 months 中放入任何参数。计算机只初始化一个空白数组。[1] 请注意,调用数组的构造函数不是可选的,因为你不能将任何元素分配给未定义的变量。

在第二部分,我们将学习如何操作数组。目前,让我们专注于使用循环与数组一起使用。以下示例展示了如何使用 for 循环与数组一起使用

代码 结果
var dogs:Array = new Array();
dogs[0] = "Spot";
dogs[1] = "Lucky";
dogs[2] = "Max";
...
dogs[9] = "Rover";
for(var i:Number = 0; i < dogs.length; i++){
     dogs[i] = dogs[i] + "is a good dog.";
     trace(dogs[i]);
}

Spot 是一只好狗。
Lucky 是一只好狗。
Max 是一只好狗。
...
Rover 是一只好狗。

上面的循环将字符串 "is a good dog." 添加到每个元素的末尾,并追踪它。请注意,数组的 length 属性是其中的元素数量,在本例中为 9。

什么是 arguments 对象?

[编辑 | 编辑源代码]

在关于函数的章节以及本章的前面,我们简单地考察了 arguments 对象。让我们回顾一下它。

arguments 实际上是一种有趣的数组类型。它包含传递给函数的所有参数(请注意,这可能与声明的参数数量不同)。请看以下示例

代码 结果
function grabStrings(string1:String, string2:String, string3:String, string4:String):Void{
     trace(arguments.length);
     trace(arguments[0]);
}
grabStrings("foo", "bar", "baz");

3
foo

在这个示例中,我们首先跟踪了 arguments 对象的长度,它为 3(传递了三个参数:foo、bar 和 baz)。然后我们跟踪第一个参数 "foo"。现在让我们用循环来使用它

代码 结果
function traceStrings(string1:String, string2:String, string3:String, string4:String):Void{
     for(var i:Number = 0; i < arguments.length; i++){
          trace(arguments[i]);
     }
}
traceStrings("foo", "bar", "baz");

foo
bar
baz

在上面的示例中,我们不需要担心追踪 "undefined",因为循环只持续到 arguments 对象的长度。

什么是 whiledo ... while 循环?

[编辑 | 编辑源代码]

while 循环 允许我们指定一个条件,而无需使用计数器。语法如下

while(condition){
     Statements if the condition is true;
}
代码 结果
var months:Array = new Array();
months[0] = "January";
months[1] = "February";
months[2] = "March";
...
months[10] = "December";
var i:Number = 0;
while(months[i].substring(months[i].length - 4, months[i].length) == "uary" ){
     trace(months[i++]);
}

一月
February

您现在不必理解条件是如何工作的。只需认为,如果月份以 "uary" 结尾,它就会返回 true。在这个脚本中,计算机将持续追踪月份,直到它到达一个不以 "uary" 结尾的月份,在本例中是 "March"。

使用 while 循环更容易陷入无限循环的陷阱。尽量避免它们!

do ... while 循环类似,只是它确保它会在第一次始终执行该操作。例如

代码 结果
var days:Array = new Array();
days[0] = "Monday";
days[1] = "Tuesday";
days[2] = "Wednesday";
days[10] = "Sunday";
var i:Number = 0;
do{
     trace(days[i++]);
} while(days[i].length > 6 );

Monday
Tuesday
Wednesday
Thursday

在这个示例中,第一个元素 "Monday" 被追踪,即使它正好是六个字母长。循环在 "Friday" 处停止,它也是六个字母长,但由于它不是第一个元素,因此没有被邀请到俱乐部。

如何使用 for ... in 循环?

[编辑 | 编辑源代码]

除了 for 循环,还有另一种类型的循环,叫做 for ... in 循环。它循环遍历一个类的所有 "可循环" 属性。对于数组,这指的是所有元素。变量是否 "可循环" 取决于它的 可见性,我们将在第三部分介绍。语法如下

for(Declaration of the counter without initialisation in Target object) {
    Statements to be executed;
}

目标对象可以是任何复合数据类型。让我们将狗循环改写成 for ... in 循环

代码 结果
var dogs:Array = new Array();
dogs[0] = "Spot";
dogs[1] = "Lucky";
dogs[2] = "Max";
...
dogs[9] = "Rover";
for(var i:String in dogs){
     dogs[i] = dogs[i] + "is a good dog.";
     trace(dogs[i]);
}

Spot 是一只好狗。
Lucky 是一只好狗。
Max 是一只好狗。
...
Rover 是一只好狗。

在上面,计算机循环遍历 dogs 的所有元素,在末尾添加 "is a good dog.",并追踪。请注意,尽管 i 是一个字符串,但 Flash 会自动将其转换为索引。

现在让我们再试一次,使用 Object 实例。

代码 结果
var spot:Object = {species:"chihuahua", colour:"brown"}
for(var i:String in spot){
     trace(spot[i]);
}

chihuahua
brown

在本例中,Flash 循环遍历了 spot 的两个可见属性(species 和 colour)并返回了它们的值。

到目前为止,我们已经介绍了五个章节。在每种情况下,您,程序员,都是唯一输入应用程序的人。然而,ActionScript 的目的是创建一个交互式应用程序,终端用户也可以输入系统。在下一章,我们将介绍最主要的方法:通过事件处理。

  1. 由于存在全局函数 Array(),如果您不想,则不必在 Array() 之前放置 "new"。
华夏公益教科书