跳轉到內容

ActionScript 2.0/函式簡介

來自 Wikibooks,開放世界中的開放書籍
ActionScript 2.0 簡介
運算子 函式 屬性和方法

關鍵概念


  • 函式的定義
  • 程式碼塊
  • 函式宣告
  • 函式呼叫
  • 引數
  • 返回值
  • 命名函式
  • 呼叫者和被呼叫者
  • 變數中的函式

現在我們已經學習了所有運算子,我們可以進入下一部分:函式。

什麼是函式?

[編輯 | 編輯原始碼]

在數學中,一個函式由輸入、過程和輸出組成。例如,如果將 x = 3 輸入到 f(x) = 2x 中,我們得到輸出 6。

在計算機中,一個函式是一個語句集合。當一個函式被執行時,函式內部的所有語句都將被執行。一個函式可能或不可能有輸入,一個函式可能或不可能有輸出。(當然,對於必須有輸出的電子表格函式來說,後者是不可能的。)

如何宣告一個沒有輸入和輸出的函式?

[編輯 | 編輯原始碼]

以下是一個簡單的函式,沒有輸出也沒有輸入。看看程式碼,我們會一步一步地解釋它

程式碼 結果
var someNumber:Number = 5;
function addOneToSomeNumber():Void{
    someNumber++;
}

首先,第一條語句是一個簡單的變數宣告語句,我們之前已經學習過了。

第二行包含各種元素

  • function 被新增到函式宣告的開頭,就像 var 被新增到變數宣告的開頭一樣。
  • addOneToSomeNumber 是我們函式的名稱。
  • 括號用於函式的輸入。雖然此函式不涉及輸入,但我們仍然必須新增括號。
  • :Void 部分用於函式的輸出。通常,Void 將被輸出的資料型別替換。由於此函式不涉及輸出,因此我們使用關鍵字 Void 代替。
  • 左花括號標誌著一個程式碼塊的開始。

程式碼塊指的是用一對花括號括起來的語句組。這些語句將按順序執行。在一個函式中,程式碼塊被稱為函式的主體。稍後,我們將學習程式碼塊的其他應用。請記住,我們總是縮排程式碼塊中的語句。這將在 Flash API 中自動為您完成。

如何呼叫一個沒有輸入和輸出的函式?

[編輯 | 編輯原始碼]

為了使用一個函式,我們需要呼叫它。讓我們再看看上面的例子

程式碼 結果
var someNumber:Number = 5;
function addOneToSomeNumber():Void{
    someNumber++;
}
addOneToSomeNumber();
trace(someNumber);

6

在上面的函式呼叫中,我們只是呼叫了函式 addOneToSomeNumber。後面的括號用於函式的輸入,我們將在下一節中介紹。計算機執行了函式,該函式涉及將 someNumber 增加 1。這就是我們得到結果 6 的方式。

如何宣告和呼叫一個帶有輸入的函式?

[編輯 | 編輯原始碼]

在程式設計中,函式的輸入被稱為引數引數[1]讓我們修改我們的 addOneToSomeNumber 函式以適應將任何數字新增到 someNumber。

程式碼 結果
var someNumber:Number = 5;
function addAnyNumberToSomeNumber(anyNumber:Number):Void{
    someNumber += anyNumber;
}
addAnyNumberToSomeNumber(2);
trace(someNumber);
trace(anyNumber);

7
未定義

在這個例子中,程式碼 anyNumber:Number 被放到了括號中。這是函式的輸入,寫成 變數名:資料型別[2]輸入後,anyNumber 被稱為區域性變數。這意味著它不能在函式外部被引用。這就是為什麼我們不能在最後跟蹤 anyNumber 的原因。

請注意,這不會導致錯誤,但會返回關鍵字 undefined。每當我們嘗試引用一個未定義的值時,Flash 將返回 undefined 值。我們將在稍後討論 undefined 及其孿生兄弟 null

要呼叫函式 addAnyNumberToSomeNumber,我們只需要在括號中放入值。不需要資料型別!

現在讓我們修改程式碼以包含兩個輸入

程式碼 結果
var someNumber:Number = 5;
function addTwoNumbersToSomeNumber(firstNumber:Number, secondNumber:Number):Void{
    someNumber += firstNumber + secondNumber;
}
addTwoNumbersToSomeNumber(5, 3);
trace(someNumber);

13

逗號用於分隔兩個引數。這也可以用於三個或更多個引數。

如何宣告和呼叫一個帶有輸出的函式?

[編輯 | 編輯原始碼]

再看看我們的 addAnyNumberToSomeNumber 程式碼。假設我們不想觸碰原始變數,但仍然希望得到 anyNumber 和 someNumber 的總和。這就是帶有返回值的函式派上用場的地方。

程式碼 結果
var someNumber:Number = 5;
function addTwoNumbers(originalNumber:Number, anyNumber:Number):Number{
    return (originalNumber + anyNumber);
}
trace(addTwoNumbers(someNumber, 7));

12

在這個函式中,someNumber 的值被傳遞了,但函式沒有改變 someNumber,而是直接將 someNumber 和 7 的總和返回給 trace 函式。

請注意,由於此函式只包含一個 return 語句,而不包含其他任何內容,因此將函式作為單獨的語句呼叫是沒有意義的

程式碼 結果
var someNumber:Number = 5;
function addTwoNumbers(originalNumber:Number, anyNumber:Number):Number{
    return (originalNumber + anyNumber);
}
addTwoNumbers(someNumber, 7);

什麼也沒發生

看,什麼也沒發生!該函式適合返回一個值,但沒有其他作用。

還要注意,返回值中的函式可以以多種靈活的方式使用,而不僅僅侷限於跟蹤。例如,看看下面的程式碼

程式碼 結果
var someNumber:Number = 5;
function addTwoNumbers(originalNumber:Number, anyNumber:Number):Number{
    return (originalNumber + anyNumber);
}
var yetAnotherNumber:Number = 6 / addTwoNumbers(someNumber, 7);
trace(yetAnotherNumber);

0.5

在這個指令碼中,計算機首先計算 addTwoNumbers(someNumber, 7) 的值,它等於 12。然後它執行運算 6 / 12,最後將其賦值給 yetAnotherNumber。

總之,函式宣告的語法如下

function functionName(parameter1:DataType1, parameter2:DataType2...):ReturnDataType{
    Statements;
    return value;
}

我應該如何命名我的函式?

[編輯 | 編輯原始碼]

像變數一樣,你不能用保留字來命名函式,並且函式只能以字母開頭。根據已有的命名約定,好的函式名以動詞開頭,可以與其他單詞使用駝峰式命名法連線起來。例如,eatWatermelon()、drinkWater() 和 smashVase()。

什麼是呼叫者和被呼叫者?

[編輯 | 編輯原始碼]

當一個函式被呼叫時,它被稱為被呼叫者。當一個函式被另一個函式呼叫時,呼叫函式被稱為呼叫者

函式的arguments 物件可以找到呼叫者和被呼叫者。以下示例跟蹤呼叫者和被呼叫者

程式碼 結果
function uselessFunction():Void{
     trace(arguments.caller);
     trace(arguments.callee);
}
uselessFunction();

[type Function]
[type Function]

請注意,由於函式無法以文字形式表示,因此計算機跟蹤 [type Function],這只是表示它是一個函式。

我可以將一個函式放到一個變數中嗎?

[編輯 | 編輯原始碼]

如果你真的想,你可以在一個變數中放一個函式。以下是語法

var variableName:Function = function(parameter1:DataType1, parameter2:DataType2...):ReturnDataType{
   Statements;
   return value;
}

以下是一個例子

程式碼 結果
var someFunction:Function = function(someString:String):Void{
	trace(someString);
}
someFunction("Hello world!");

你好,世界!

等等,那麼 trace 函式是怎麼回事?

[編輯 | 編輯原始碼]

到目前為止,你可能想知道你在哪裡獲得了 trace 函式,因為你從未在任何地方定義過它。閱讀下一章以瞭解詳情!

  1. 嚴格來說,引數指的是要填寫的“欄位”,而引數指的是引數的值。
  2. 與變數宣告類似,對變數進行強型別化並不是必須的,但這是一個好習慣。
華夏公益教科書