跳轉到內容

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"。
華夏公益教科書