Re: [問題] 一個簡化程式的問題

看板Flash作者 (CJ Cat)時間12年前 (2012/07/17 05:53), 編輯推噓3(3018)
留言21則, 3人參與, 最新討論串2/2 (看更多)
[追加] 補上事後寫的AS3 Event Listener Delegtes詳細文章 http://allenchou.net/2012/07/actionscript-3-0-event-listener-delegates/ 可以考慮把參數和function reference包到物件裡 這個技巧就是所謂的"委派" (delegate) //in delegate.as package { public function delegate(func:Function, ...params):Function { return new Delegate(func, params).invoke; } } import flash.events.Event; class Delegate { private var func_ :Function; private var params_ :Array; public function Delegate(func:Function, ...params) { func_ = func; params_ = params; } public function invoke(e:Event):void { func_.apply(null, params_); } } //end of Delegate.as //in time line function myListener(i:int):void { gotoAndPlay(i); } for (var i:int = 0; i < 3; ++i) { addEventListener ( MouseEvent.CLICK, delegate(myListener, i) ); } 當然,如果你的myListener裡面只有呼叫gotoAndPlay的話 其實根本不用額外宣告myListener這個function 直接傳入gotoAndPlay就可以了 addEventListener ( MouseEvent.CLICK, delegate(gotoAndPlay, i); ); -- Blog http://blog.cjcat.net Gallery http://cjcat2266.deviantart.com ptt2 Board CJWorkshop -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 72.5.59.140 ※ 編輯: cjcat2266 來自: 72.5.59.140 (07/17 06:57)

07/17 06:58, , 1F
補上含詳細說明的blog連結 :)
07/17 06:58, 1F
※ 編輯: cjcat2266 來自: 72.5.59.140 (07/17 07:16)

07/17 12:36, , 2F
有神!快推!!
07/17 12:36, 2F

07/17 13:02, , 3F
研究中 先給推
07/17 13:02, 3F

07/17 13:06, , 4F
不過這時func_應該可以直接寫成func_(params_)
07/17 13:06, 4F

07/17 13:33, , 5F
不行,因為params_是陣列,要用Function.apply傳入
07/17 13:33, 5F

07/17 13:46, , 6F
不過照我那樣寫丟值進去可執行耶~@@~難道他會自己轉換?
07/17 13:46, 6F

07/17 13:48, , 7F
當然直接myListener([1]);會直接掛掉!
07/17 13:48, 7F

07/17 13:50, , 8F
還蠻神奇的
07/17 13:50, 8F

07/17 14:44, , 9F
樓上是用trace測試嗎? 用trace會自動呼叫Array.toString
07/17 14:44, 9F

07/17 14:44, , 10F
將Array轉換成 element1, element2, element3 的字串格
07/17 14:44, 10F

07/17 14:49, , 11F
是用trace沒錯!像是傳入[1]會輸出1,但傳入[1,2]會輸出0
07/17 14:49, 11F

07/17 14:49, , 12F
所以是trace的原因阿~@@
07/17 14:49, 12F

07/17 14:55, , 13F
所以http://goo.gl/aaR6T 也是這個原因囉?
07/17 14:55, 13F

07/17 15:07, , 14F
int([1]) → int("1") → 1
07/17 15:07, 14F

07/17 15:07, , 15F
int([1, 2]) → int("1, 2") → 0
07/17 15:07, 15F

07/17 15:08, , 16F
因為"1, 2"非合法數字字串,導致隱晦轉型失敗
07/17 15:08, 16F

07/17 15:08, , 17F
而使用預設int值,也就是 0
07/17 15:08, 17F

07/17 15:12, , 18F
不過這樣為什麼第一種不行第二種就可以過,還是搞不懂
07/17 15:12, 18F

07/17 15:20, , 19F
一切都是隱晦轉型在搞鬼,沒把握的話就別去踩地雷唄
07/17 15:20, 19F

07/17 15:21, , 20F
乖乖按照正確type來寫最安全
07/17 15:21, 20F

07/17 15:23, , 21F
感謝CJ神的解惑!!
07/17 15:23, 21F
文章代碼(AID): #1G18rOp0 (Flash)
文章代碼(AID): #1G18rOp0 (Flash)