FLASH函數的基本概念

來源:互聯網
上載者:User
概念|函數
  函數是在程式中可以重複使用的代碼. 你可以將需要處理的值或對象通過參數的形式傳遞給函數, 然後由函數得到結果. 從另一個角度說, 函數存在目的就是為了簡化編程的負擔, 減小代碼量和提高效率. 而一個寫得好的函數, 就像一個"黑箱", 你只要懂得調用它就行了, 而不用去關心它的具體功能是如何?的
建立自己的函數---函數定義(Definition)
要建立一個函數, 就需要有函數的定義. 對於 Actions cript, 就沒有什麼傳回值類型, 形參實參之類的東西好討論了. 下面是一個簡單函數的定義:
//計算矩形面積的函數
function areaOfBox(a, b) {
return a*b; //在這裡返回結果
}
//測試函數
area = areaOfBox(3, 6);
trace("area="+area);
現在來分析一下函數定義的結構. function 關鍵字說明這是一個函數定義, 而不是一段執行代碼. 其後便是函數的名稱: areaOfBox. 函數名後面的括弧內是函數的參數列表(也可以沒有參數, 但括弧是必須要有的). 緊接著的大括弧內是函數的實現代碼, 即 Actions cript 語句. 如果函數需要傳回值, 可以使用 return 關鍵字加上要返回的變數名, 運算式或常量名. 在一個函數中可以有多個 return 語句, 但無論何時, 只要執行了其中的任何一個 return 後, 函數便自行終止而不會繼續執行下去. 如果沒有 return 語句, 則在函數尾最後一個語句執行後結束.
因為 Actions cript 的特殊性, 函數的參數定義並不要求參數類型的聲明, 即可以不指定參數類型. 這省去了很多麻煩, 也帶來了一些問題. 雖然把上例中倒數第二行改為 area = areaOfBox("3", 6); 也同樣可以得到 18 的結果, 但是這對程式的穩定性非常不利(假如函數裡面用到了 a+b 的話, 就會變成字串的串連運算, 結果自然會出錯). 所以, 有時候在函數中類型檢查是不可少的.
在函數體中參變數用來代表要操作的對象. 你在函數中對參變數的操作, 就是對傳遞給函數的參數的操作. 上例中的 a*b 在你調用函數時會被轉化為參數的實際值 3*6 處理.

--------------------------------------------------------------------------------
函數還有一種建立方法, 叫做函數顯式聲明(function literal, 不是通過正式的函式宣告而是在一個運算式內通過未命名的函數來進行聲明):
areaOfBox = function(a,b) {return a*b;};
trace("area="+areaOfBox(2,3));
這種形式的聲明經常用在對象的方法或是函數庫的函式宣告中.
在 Flash MX 的協助中函數定義部分關於這種聲明的範例代碼有誤, 請注意.

--------------------------------------------------------------------------------
上面是有傳回值的函數, 在函數尾使用了 return 關鍵字來返回結果. 函數也可以不返回任何值. 如下例:
//無傳回值的函數
function areaOfBox(a, b) {
_root.area = a*b;
}
//測試函數
areaOfBox(3, 6);
trace("area="+_root.area);
它的結果也是 18, 只不過最後的結果是傳遞到 _root 下的指定變數 area 而已.下面一個例子更簡單:
//計算矩形面積的函數
function simpleFunc() {
trace ("什麼都沒有"); //在這裡返回結果
}
//測試函數
simpleFunc();
最後的輸出就是 trace 中的字串. 就是說, 函數可以既沒有參數也沒有傳回值, 而是一系列操作的集合. 可見函數的使用具有很高的靈活性.

--------------------------------------------------------------------------------
同變數一樣, 函數也可以具有全域性. 只要在聲明時在前面給它加一個 _global 就可以了:
//計算矩形面積的全域函數
_global.areaOfBox = function (a, b) {
return a*b; //在這裡返回結果
}
//測試函數
area = areaOfBox(3, 6);
trace("area="+area);
請注意: 在函數體中出現的關鍵字 this 代表的是調用函數的 MovieClip, 而不是函數體所在的 MovieClip. 這很容易被忽略而產生不期望的結果. 如果要指定 this 所代表的對象就要用到 Function.call() 和 Function.apply() 方法. 在後面的 arguments 對象介紹中會講到.
函數參數的檢查

為了保證函數啟動並執行正確性, 我們有時必須檢測使用者是否給了足夠的或是正確類型的參數. 下面是我對上面例子進行改動後的代碼:
//計算矩形面積的全域函數
_global.areaOfBox = function (a, b) {
//輸出兩個參數之和, 用於理解下面的 typeof 語句
trace("a+b="+(a+b));
//檢測參數是否足夠且類型正確
if(a==undefined || b==undefined || typeof(a+b)!="number") {
trace("<參數錯誤>");
return 0; //返回 0 作為錯誤時的結果
}
return a*b; //在這裡返回結果
}
//測試函數
trace("----下面是正確的參數----");
area = areaOfBox(3, 6);
trace("area="+area);
trace("----下面是錯誤的參數----");
//這裡為了節省篇幅, 我在命令中直接調用函數, 而不是先將傳回值賦給一個變數
//其實這才是我們常用的函數調用方法
trace("area="+ areaOfBox(3, "6"));
trace("----下面是不足的參數----");
trace("area="+areaOfBox(3));
上例中我用 a==undefined 來判斷 a 是否被賦值了(即是否已定義, 對於 undefined 資料類型的內容請參閱前一章的內容). 為了確保萬無一失, 我還用了 b==undefined 來保證 b 也已被賦值, 中間使用一個邏輯 "或" 運算子 || 來串連這兩個條件.
此外, 在這兩個條件後面我又通過 typeof(a+b)!="number" 來確認參數類型是否正確(關於 typeof 關鍵字的資訊請參考前一章). 這裡我利用了 Actions cript 的一個特點: 數值與字串相加的和會被優先做為字串處理. 所以 a+b 中只要有一個為字串, 那麼整個 a+b 的傳回值就是一個字串, 在後面通過 typeof 來檢測的結果自然就不是我們所要的 "number". 通過 trace("a+b="+(a+b)); 輸出的結果可以看出這一點.

--------------------------------------------------------------------------------
在 Actions cript 中除了使用者定義的函數外, 還有預定義的內建函數. 對於不同的對象, 也有不同的函數(或者說是方法)可以調用. 下面是擁有最高優先順序的系統內建函數列表:
函數 說明
Boolean 將所給參數值轉化為邏輯值(也叫做布爾值)
escape 將所給參數轉化為字串並用 URL 格式編碼(所有非標準字元將被轉化為以 % 開頭的十六進位值)
eval 返回所給參數表示的對象, 參數可以是常量, 運算式, 屬性等(這在 DuplicateMovieClip 時經常用到)
getProperty 返回指定對象的指定屬性值
getTimer 返回從動畫開始運行到當前所經過的毫秒數
getVersion 返回 Flash 版本和作業系統資訊
isFinite 返回所給參數是否是有窮的(邏輯型傳回值)
//建立新對象
object_1 = new Object();
object_1.value = 0; //為對象加入 value 屬性並給予初值 0
object_2 = object_1; //由 object_1 複製出一個 object_2, 此時兩者的 value 屬性均為 0
<!-- / message --><!-- sig -->
//測試函數
areaOfBox.call(object_1, 3, 6);
trace("object_1.value="+object_1.value);
array_ab = [4, 5]; //建立參數數組
areaOfBox.apply(object_2, array_ab);
trace("object_2.value="+object_2.value);

為什麼要通過 call 和 apply 來調用函數? 這樣不比前面的直接調用麻煩嗎?
的確, 這樣調用函數比較麻煩, 但你注意到了我使用的第一個參數沒有? 通過第一個參數可以指定在函數體中的 this 關鍵字代表什麼對象, 這就是用 call 和 apply 的好處(關於對象和 this 的內容在後面章節中才會提到, 在這裡暫且不提). 這個好處只有在實際的編程中你才能體會得到, 這裡只是簡要介紹一下, 讓你有個基本的概念.
如果函數中沒有使用 this 關鍵字, 第一個參數要用 null 代替.
在本例中第一個傳回值被放入 object_1 的 value 屬性中, 另一個會被放入 object_2 的 value 屬性中. 通過 call 和 apply 的第一個參數我們讓函數體中的 this 先後代表了 object_1 和 object_2 兩個對象. 第一個參數後面的實際參數的給予完全依照要調用函數的參數個數和類型確定.
至於 call 與 apply 的不同之處上面已經表示得很明白了: apply 的實際參數是通過數組傳遞的.
arguments 對象
arguments 對象
arguments 對象, 顧名思義就是參數對象, 它包含的是函數調用的參數. 作為一個數組對象, 它只有三個屬性:
屬性 描述
arguments.callee 正被調用的函數
arguments.caller 進行中此調用的函數
arguments.length 傳遞給被調用函數的參數數目
                                   來源: 閃吧




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。