2011-11-07 75 views
2

我試圖執行下面的actionscript3程序,我很驚訝f()函數調用的結果。我期待f()的結果是「1」或至少「未定義」,但「0」值對我來說沒有任何意義。意外的行爲訪問腳本變量的屬性

如果您有這種行爲,或者想知道您是否將此行爲視爲「正常」,我將很高興對此行爲有一個很好的解釋。 我想確切地說,我正在研究動作腳本程序的行爲,以便了解AVM2是如何工作的,因此我不會要求等效代碼執行相同的操作。因此,如果你有其他棘手的例子,我也感興趣。

package { 
import flash.display.Sprite; 

    public class S2 extends Sprite { 
     public function f():* { 
      return x; 
     }  
     public static function fs():*{ 
      return x; 
     }  
    } 
} 
var x:int = 1 ; 
var a:S2 = new S2(); 
var g:Function = a.f; 
var gs:Function = S2.fs; 
trace("tracing(g)...:"+g()); //tracing(g)...:0 
trace("tracing(gs)...:"+gs()); //tracing(gs)...:1 

注:我編這個程序使用以下命令行:

mxmlc -debug -static-link-runtime-shared-libraries=true -output S2.swf -- S2.as 

回答

1

x變量在不同的範圍比x你是從S2.f()

S2返回延伸Sprite存在,這又擴展了DisplayObject,它已經具有ax屬性。
這就是你要回來的。

如果您將變量名稱更改爲類似myX的東西,您將收到預期的錯誤。

這樣做會改變返回什麼:

var a:S2 = new S2(); 
a.x = 10; 
trace(a.f()); // will trace 10 
+0

這是正確的!謝謝。這是符合語言規範的唯一答案,但我忘記了這麼簡單的程序已經有很多超類。 –

+0

只是另一件事:沒有「-debug」選項編譯相同的程序會導致「堆棧下溢」錯誤(與在Linux上的flex45 sdk)。生成的字節代碼真的很奇怪(包括在空操作數堆棧上彈出......),在編譯過程中是否已經遇到過這樣的問題? –

+0

這是一個非常不規範的編寫actionscript代碼的方式,我真的很驚訝它甚至可以在類聲明之後的代碼中運行。如果你添加了另一個類,並把它放在它的構造函數中,你應該有更好的運氣。 – grapefrukt