ActionScript 2.0/控制语句简介
关键概念
- 控制语句
- 选择语句和条件
- switch语句
default
,break;
- for循环
- 数组
while
和do ... while
循环for ... in
循环- 在条件和循环中使用
arguments
有时我们需要多次执行某个操作。有时我们不想在某些情况下执行操作,但在其他情况下却想执行。本章将介绍控制语句,它控制语句的执行方式。
选择语句,也称为条件语句,是一种控制语句,允许你在值为真时执行一个操作,而在值为假时执行另一个操作。确定将执行哪个操作的布尔值称为条件。
考虑以下示例
代码 | 结果 |
---|---|
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 中的选择!如果你这样做,就像有两面镜子互相面对一样,会导致无限循环。我们将在本章后面讨论无限循环。
有时我们有多个条件,为每个条件创建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(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.");
}
|
|
以下步骤参与其中
- i 设置为零。
- 由于 0 < 10 为真,计算机追踪该语句。i 增加 2 并变为 2。
- 由于 2 < 10 为真,计算机追踪该语句。i 增加 2 并变为 4。
- 由于 4 < 10 为真,计算机追踪该语句。i 增加 2 并变为 6。
- 由于 6 < 10 为真,计算机追踪该语句。i 增加 2 并变为 8。
- 由于 8 < 10 为真,计算机追踪该语句。i 增加 2 并变为 10。
- 由于 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 小于 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]);
}
|
|
上面的循环将字符串 "is a good dog." 添加到每个元素的末尾,并追踪它。请注意,数组的 length 属性是其中的元素数量,在本例中为 9。
在关于函数的章节以及本章的前面,我们简单地考察了 arguments 对象。让我们回顾一下它。
arguments 实际上是一种有趣的数组类型。它包含传递给函数的所有参数(请注意,这可能与声明的参数数量不同)。请看以下示例
代码 | 结果 |
---|---|
function grabStrings(string1:String, string2:String, string3:String, string4:String):Void{
trace(arguments.length);
trace(arguments[0]);
}
grabStrings("foo", "bar", "baz");
|
|
在这个示例中,我们首先跟踪了 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");
|
|
在上面的示例中,我们不需要担心追踪 "undefined",因为循环只持续到 arguments 对象的长度。
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++]);
}
|
|
您现在不必理解条件是如何工作的。只需认为,如果月份以 "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" 被追踪,即使它正好是六个字母长。循环在 "Friday" 处停止,它也是六个字母长,但由于它不是第一个元素,因此没有被邀请到俱乐部。
除了 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]);
}
|
|
在上面,计算机循环遍历 dogs 的所有元素,在末尾添加 "is a good dog.",并追踪。请注意,尽管 i 是一个字符串,但 Flash 会自动将其转换为索引。
现在让我们再试一次,使用 Object
实例。
代码 | 结果 |
---|---|
var spot:Object = {species:"chihuahua", colour:"brown"}
for(var i:String in spot){
trace(spot[i]);
}
|
|
在本例中,Flash 循环遍历了 spot 的两个可见属性(species 和 colour)并返回了它们的值。
到目前为止,我们已经介绍了五个章节。在每种情况下,您,程序员,都是唯一输入应用程序的人。然而,ActionScript 的目的是创建一个交互式应用程序,终端用户也可以输入系统。在下一章,我们将介绍最主要的方法:通过事件处理。
- ↑ 由于存在全局函数 Array(),如果您不想,则不必在 Array() 之前放置 "new"。