仔細研究之後,發現是Macromedia編譯的Bug
當一個AS 2.0的Class繼承MovieClip
在其成員函式內呼叫stop、play、.....等函式
又未明確指定對象this時候
Macromedia的編譯器會自動替該函式呼叫加上this
但是卻會漏失一個Op Code - POP
導致執行的時候會有一個多餘的資料殘存在Stack內
間接引起回傳值接收錯誤
用Flash 7、8編譯都會發生此錯誤
至於最新的Flex 2.0 Builder Alpha 1則沒有發現,可能是因為編譯器是用Java重新寫的
所以沒有繼承到IDE編譯器的Bug
倘若連續下兩個stop
理論上會有兩個資料殘存
接著連續作三次指定的動作
結果會發現有兩個變數都沒有得到資料
以下是Demo程式
fla frame 1 AS:
var v1;
var v2;
var v3;
var mc:Test = new Test();
v1 = v2 = v3 = mc.echo();
trace("v1 : " + v1);
trace("v2 : " + v2);
trace("v3 : " + v3);
// output:
// v1 : undefined
// v2 : undefined
// v3 : echo
Test.as Class:
//要繼承MovieClip
class Test extends MovieClip {
public function echo():String {
//
// 以下函式皆會造成編譯時缺少 pop op code
// 導致執行時 Stack 內有多餘的資料無法清除
//
// play();
// stop();
// gotoAndPlay(1);
// gotoAndStop(1);
// nextFrame();
// prevFrame();
//
// startDrag(this);
// stopDrag();
//
// unloadMovie(null);
//
// getURL("http://www.google.com", "_blank");
// loadVariables("http://www.google.com", "_root");
//
stop();
stop();
return "echo";
}
}
// Ticore's Blog - http://ticore.blogspot.com/
Read more...



