天天看點

Flex3, ActionScript面試題集

1.as2與as3.的最主要差別是什麼? 答:首先,as2和as3是完全不同的語言,幾乎沒有相容性可言。as2編譯用的AVM1虛拟機,as3用的AVM2,速度快,提供了一些基礎異常處理。 as3是純的OOP,強類型語言。as2不是。具體的差别有太多太多。 2.flex的開發架構有哪些,它們有什麼優缺點? 答: 最常見的當然是Cairngorm、Puremvc了,此外還有Mate,Swiz等等,據說被廣泛應用的已經有10幾款了。Cairngorm作為 Adobe官方出品,有着貴族血統的它比較全面,是這些架構中已知bug最少的,但是基于他的應用相對臃腫複雜一些,需要對每個可以被觸發的事件寫一個對 應的Command,編碼量巨大,并且單元測試很不容易,不适合靈活開發。Puremvc應該是現在用的最多的as架構了。比較完善、并且與 Cairngorm相比,更适合中小型應用的開發,它與Cairngorm一樣,也是以MVC模式為中心,并以Façade作為中央存儲器的單件類的形式 進行開發的。說下Mate,它是一個比較奇怪的架構,是基于标簽的事件驅動型的。也就是說你不能再随意的寫as類的,在使用Mate的情況下,隻能用 MXML來做這些事情。Swiz是Mate的孿生兄弟,長的挺像,沒具體用過,不大了解。 3.在flex開發中,很多代碼都寫在mxml檔案裡, 為了做到mvc模式,你是怎麼處理的。 我認為mxml并不影響mvc模式啊。分兩種情況來讨論,首先,是自己建立整個應用結構的時候,那我們可以手動将UI所在的mxml歸為一類,然後由 Mediator去操作或者說控制這些元件既可了,然後Mediator又統一交給Controller去操作。如果采用其他架構來進行開發的話,那就更 不用來考慮這個問題了,像Cairngorm、Puremvc之類的架構已經很好的為我們解決了這些問題。隻要按照它們的使用規範來進行開發,自然沒有問 題。 4.如果發生記憶體洩露,你是如何解決的? 在profile觀察中已經記憶體洩漏是沒有很好的解決辦法的,至少我不知道,我能做的隻是盡量去避免這種情況的發生,比如說 注意不要循環引用,特别是在使用Timer的時候要格外注意,不要忘記全局對象上的引用的清除,在建立控制器和模型的時候要注意一定要使用單件模式。在 addEventListener時候盡量采用弱引用、自引用、或者子對象引用,以避免記憶體洩漏。 5。as3.0垃圾回收器是如何工作的? flash player 8之前采用的是引用計數法,在flash player 8 之後用的是标記法,簡單的說就是:從應用的根節點開始,周遊所有其上的引用,标記每個它所發現的 對象。然後疊代周遊每個被标記的對象,标記它們的 子對象。這個過程第歸進行,直到Player周遊了應用的整個對象樹并标記了它所發現的每個東西。在這個過程技術的時候,可以安全地認為,記憶體中那些沒有 被打标記的對象沒有任何活動引用,是以可以被安全地釋放記憶體。一般來說,flash player采用的是一種低頻的垃圾回收機制,Flash Player的垃圾回收發生在Flash Player需要另外請求記憶體之前。但并不是每次應用申請記憶體時都會導緻垃圾回收的執行,隻有當Flash占用的記憶體緊張到一定程度時才會執行真正的垃圾 回收,一定程度上取決于用戶端計算機的實體記憶體的大小。 6 flex和背景語言是如何互動的? 無疑就這兩種方法:remote object 或者是Http service 7。你是如何處理前端速度慢的問題? flex前端速度慢 其實仔細說應該分2部分,1.是flex生成的swf由于SDK龐大的關系,swf體積也跟着龐大了,這我們可以做的就是用Module動态加載,還有就 是RSL了。2.處理速度慢,遠端方法速度慢,這是AVM的硬傷了,基本沒有很好的解決方法,我們能做的隻是讓這個異步進行的更完美一些,讓使用者在等待的 過程中,做其他的事情,以至于讓使用者忽略這段等待的時間。 8.flash與flex是如何協調開發的? 這個問題可以這樣來了解,如果是确實需要用到FLEX SDK的應用,那我們就可以建立一個flex工程,具體需要flash做UI的時候,輸出成swc作為flex的skin,如果說并不需要flex sdk,隻是為了編碼友善而選擇flex的話,那我們隻要建立一個as工程,讓flex作為flash的編碼器。 9.使用Flex Bulider3建立一下新的.mxml的頁面時預設的背景是藍色的,請問用什麼辦法能修改掉此背景顔色,以至于下次建立時背景不是為預設的藍色的呢?請 寫出你認為正确的方法. 還真不會,我的做法一般是在這個工程裡面,建一個總的css,都在裡面規範起來,包括背景色啊,還有字型大小等等。。 10. 使用Flex Bulider3如何跟蹤程式? 裝個debug版本的flash player,到時候在FB裡面F11 debug它咯。 11. 請問enterFrame和timerEvent這2個事件有什麼差別?請說下具體的使用方法和相關的使用場合? 不會 我覺得差不多,不過我一般用enterFrame,還請高人指點。。 12. 請說下你了解AS3的事件機制是什麼機制?你認為正确的就可以說出來. AS3事件流分三個階段: 1.捕獲階段 (即由根節點流向子節點,檢測每個節點是否注冊了監聽器) 2.目标階段 (激發在目标對象本身注冊的監聽程式) 3.冒泡階段 (從目标節點到根節點,檢測每個節點是否注冊了監聽器) 當中涉及了兩個屬性target和currentTarget,target是事件的派發者,currentTarget是正在檢測的對象,當開始了事件 流,事件的currentTarget屬性處于不斷變化中. PS:注冊事件時捕獲階段預設是關閉的,無論事件是否開啟了捕獲,事件流隻會兩選一去 執行注冊的監聽程式 關于EventDispatcher三個函數的參數: 1.addEventlistener(事件類型,監聽函數,是 否打開捕獲階段,監聽器優先級别,是否打開弱監聽) 2.removeEventListener(事件類型,監聽函數,是否打開捕獲階段) (前兩個參數是必須的,如果注冊監聽器時打開了捕獲階段,那麼第三個參數也是必須的,否則會出現錯誤) 3.dispatchEvent(new Event(事件類型,是否冒泡,是否可以取消事件)) 關于Event擴充有兩點要注意: 1.可以定義字元串常量代表事件類型. 2. 構造函數必須調用父類的構造函數,super(type,bubbles,cancelable) 3.擴充Event可以使Event帶自定義變 量,進而可以傳遞資料. 13.請問addEventListener裡面有幾個參數,你能說出具體的使用方法嘛? 這題出的有點像考API記憶力呵呵, 它的五個參數分别是addEventlistener(事件類型,監聽函數,是否打開捕獲階段,監聽器優先級别,是否打開弱監聽) 具體使用方法:詳見手冊,這裡我copy來了。。 addEventListener () 方法 public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 語言版本 : ActionScript 3.0 RuntimeVersions: AIR 1.0, Flash Player 9 使用 EventDispatcher 對象注冊事件偵聽器對象,以使偵聽器能夠接收事件通知。可以為特定類型的事件、階段和優先級在顯示清單的所有節點上注冊事件偵聽器。 成功注冊一個 事件偵聽器後,無法通過額外調用 addEventListener() 來更改其優先級。要更改偵聽器的優先級,必須首先調用 removeListener()。然後,可以使用新的優先級再次注冊該偵聽器。 請記住,注冊該偵聽器後,如果繼續調用具有不同 type 或 useCapture 值的 addEventListener(),則會建立單獨的偵聽器注冊。例如,如果首先注冊 useCapture 設定為 true 的偵聽器,則該偵聽器隻在捕獲階段進行偵聽。如果使用同一個偵聽器對象再次調用 addEventListener(),并将 useCapture 設定為 false,那麼便會擁有兩個單獨的偵聽器:一個在捕獲階段進行偵聽,另一個在目标和冒泡階段進行偵聽。 不能隻為 目标階段或冒泡階段注冊事件偵聽器。這些階段在注冊期間是成對出現的,因為冒泡階段隻适用于目标節點的始祖。 如果不再需要某個事件偵聽器,可調用 removeEventListener() 删除它,否則會産生記憶體問題。由于垃圾回收器不會删除仍包含引用的對象,是以不會從記憶體中自動删除使用已注冊事件偵聽器的對象。 複制 EventDispatcher 執行個體時并不複制其中附加的事件偵聽器。(如果新近建立的節點需要一個事件偵聽器,必須在建立該節點後附加該偵聽器。) 但是,如果移動 EventDispatcher 執行個體,則其中附加的事件偵聽器也會随之移動。 如果在正在處理事件的節點上注冊事件偵聽器,則不 會在目前階段觸發事件偵聽器,但會在事件流的稍後階段觸發,如冒泡階段。 如果從正在處理事件的節點中删除事件偵聽器,則該事件偵聽器仍由目前操作 觸發。删除事件偵聽器後,決不會再次調用該事件偵聽器(除非再次注冊以備将來處理)。 參數 type:String — 事件的類型。 listener:Function — 處理事件的偵聽器函數。此函數必須接受 Event 對象作為其唯一的參數,并且不能傳回任何結果,如下面的示例所示: function(evt:Event):void 函數可以有任何名 稱。 useCapture:Boolean (default = false) — 确定偵聽器是運作于捕獲階段、目标階段還是冒泡階段。如果将 useCapture 設定為 true,則偵聽器隻在捕獲階段處理事件,而不在目标或冒泡階段處理事件。如果 useCapture 為 false,則偵聽器隻在目标或冒泡階段處理事件。要在所有三個階段都偵聽事件,請調用 addEventListener 兩次:一次将 useCapture 設定為 true,一次将 useCapture 設定為 false. priority:int (default = 0) — 事件偵聽器的優先級。優先級由一個帶符号的 32 位整數指定。數字越大,優先級越高。優先級為 n 的所有偵聽器會在優先級為 n -1 的偵聽器之前得到處理。如果兩個或更多個偵聽器共享相同的優先級,則按照它們的添加順序進行處理。預設優先級為 0。 useWeakReference:Boolean (default = false) — 确定對偵聽器的引用是強引用,還是弱引用。強引用(預設值)可防止您的偵聽器被當作垃圾回收。弱引用則沒有此作用。 類級别成員函數不屬于垃圾回 收的對象,是以可以對類級别成員函數将 useWeakReference 設定為 true 而不會使它們受垃圾回收的影響。如果對作為嵌套内部函數的偵聽器将 useWeakReference 設定為 true,則該函數将作為垃圾回收并且不再是永久函數。如果建立對該内部函數的引用(将該函數儲存到另一個變量中),則該函數将不作為垃圾回收并仍将保持 永久。 14.請問我想判斷一個字型是否是數字,用什麼辦法去判斷呢? 這問題問的有點奇怪。字型怎麼可能是數字。。。如果是問,類型是否為數字,那就typeof一下,看他是不是int或者Number,如果是問字元串内容 是否為數字,那也有很多辦法,比如說,讀出每個字元的ascii碼,判斷範圍,或者是 var a:String=”1232d4″; var b:Number=Number(a); var c:String=String(b); if(a==c){ Alert.show(”yes”); }else{ Alert.show(”no”); } 15.請問我想判斷一個 字元或者一個對象的類型怎麼判斷呢? 應該沒人出這樣的題吧? if 咯。類型的話就typeof

繼續閱讀