作者的Blog:www.kingda.org
Function究竟是什么?
我們習(xí)慣了function的存在,就像習(xí)慣了我們呼吸的空氣卻不去探究它的本質(zhì)?雌饋,似乎function和Number, Boolean, String一樣都是ActionScript本來就有的類型。
先看以下代碼:
trace (aFunc); //輸出:[type Function] trace (aFunc instanceof Function); //輸出:true trace (aFunc instanceof Object); //輸出:true
function aFunc() { trace (“This is aFunc!Excuted!”); }
第一行告訴我們aFunc的類型是Function, 第二行又證實(shí)了這一點(diǎn)aFunc確實(shí)是一個(gè)Function類型的實(shí)例,第三行更加有意思告訴我們aFunc是一個(gè)Object。
初學(xué)者可能很驚奇,其實(shí)AS2.0中除了原始數(shù)據(jù)類型Number, Boolean, String,undefined, null,其余全是Object. 而AS3.0中則更加極端,一切皆對象。包括原始數(shù)據(jù)類型也是Object,只不過是特殊的不變對象(immutable objects)類型。與主題扯遠(yuǎn)了,打住。
Function本質(zhì)上到底是怎樣的一種Object?
與其他編程語言不同,在AS中, Function是一個(gè)Object,可以有獨(dú)立的屬性甚至方法。比如arguments,callee,caller。在AS3.0中,F(xiàn)unction還由更多的屬性。 函數(shù)一旦執(zhí)行,一個(gè)特殊的對象就建立了。我們稱它為"active object",它含有以上的屬性和本地變量。這個(gè)對象我們是不可訪問的,屬于內(nèi)建的機(jī)制。同時(shí),每個(gè)Function都含有一個(gè)內(nèi)置的范圍鏈(scope chain),這時(shí)也將被建立,以使Flash Player來檢查所有的聲明。函數(shù)可以層層嵌套,范圍鏈也是如此。最大的范圍鏈那當(dāng)然是Global函數(shù)的范圍鏈了,包括所有的全局變量和函數(shù)。
知道了Function 是Object又怎樣?
會給我們帶來極大的便利和編程思維的改變: 運(yùn)用一:這是簡單運(yùn)用, 設(shè)立一個(gè)代理函數(shù)對象,根據(jù)條件的不同,將它指向不同的函數(shù),實(shí)現(xiàn)動態(tài)改變。相信有經(jīng)驗(yàn)的程序員都了解動態(tài)改變函數(shù)的便利性。而且由于AS提供了這種便利,運(yùn)用這個(gè)特性可以衍生大量技巧。
var kingdaFunc:Function; var sex:String = "male"; if ( sex == "male") { kingdaFunc = maleFunc; } else { kingdaFunc = femailFunc; } kingdaFunc(); //輸出: I am a boy
function maleFunc() { trace ("I am a boy"); } function femaleFunc() { trace ("I am a girl"); }
運(yùn)用二:建立函數(shù)執(zhí)行隊(duì)列。
比如說,我有一個(gè)對象,我想根據(jù)不同的情況對它進(jìn)行一系列的操作。但是有時(shí)需要所有的操作,有時(shí)又只需要一部分的操作。那么這個(gè)較高級的技巧,就能保證代碼的高度重用性和簡潔。
var funcAry:Array = new Array();
//將需要的操作步驟加入隊(duì)列 funcAry.push(aFunc); funcAry.push(bFunc); funcAry.push(cFunc);
//供操作的對象 var originObject:Object = new Object();
//需要執(zhí)行幾步由execQueue這個(gè)參數(shù)決定,在實(shí)際工程運(yùn)用中這個(gè)數(shù)可能是動態(tài)決定的。 var execQueue:Number = funcAry.length;
/核心步驟:/函數(shù)隊(duì)列執(zhí)行。實(shí)際運(yùn)用中可以把它包裝成一個(gè)函數(shù),或者一個(gè)類的實(shí)例。 for (var i:Number =0; i<execQueue; i++) { funcAry[i](originObject); }
//trace出執(zhí)行操作后的originObject里面的內(nèi)容 for (var i in originObject) { trace ( i + ":" + originObject[i]); }
//操作步驟a,b,c function aFunc(eO:Object) { eO.aFuncExected = true; trace ("aFunc()"); } function bFunc(eO:Object) { eO.bFuncExected = true; trace ("bFunc()"); } function cFunc(eO:Object) { eO.cFuncExected = true; trace ("cFunc()"); }
輸出內(nèi)容為:
aFunc() bFunc() cFunc() cFuncExected:true bFuncExected:true aFuncExected:true
前三行表明a,b,c三個(gè)函數(shù)按順序執(zhí)行了。后三行表明orginObject確實(shí)經(jīng)過了三步操作,多了三個(gè)為true的屬性。
黑羽提醒:技巧可以再延深! 可以通過一個(gè)函數(shù)來管理隊(duì)列里面各個(gè)元素的位置,達(dá)到改變操作函數(shù)的順序。比如通過一個(gè)數(shù)組來安排調(diào)用順序
var operationAry:Array = [2,1,0] for(var i:Number = 0; i<operationAry.length; i ++) { funcAry[operationAry[i]](originObject); }
這樣函數(shù)就通過2,1,0這樣的倒序來執(zhí)行操作。
這個(gè)技巧還有很多可以延伸的地方,比如說動態(tài)控制操作函數(shù)的參數(shù)等等,供大家自己研究擴(kuò)展。
經(jīng)典論壇討論帖: http://www.95time.cn/bbs/newsdetail.asp?id=2610583
出處:藍(lán)色理想
責(zé)任編輯:moby
上一頁 下一頁 深入了解Function [2]
◎進(jìn)入論壇Flash專欄版塊參加討論
|