2011-11-07 32 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