Actionscript 3 访问脚本变量属性的意外行为

Actionscript 3 访问脚本变量属性的意外行为,actionscript-3,bytecode,avm2,Actionscript 3,Bytecode,Avm2,我尝试执行下面的actionscript3程序,对调用f()函数的结果感到惊讶。我原以为f()的结果是“1”或至少是“未定义”,但“0”值对我来说毫无意义 如果你有这样的行为,我会很高兴有一个很好的解释,或者知道你是否认为这种行为是“正常的”。 我想确切地说,我正在研究动作脚本程序的行为,以了解AVM2是如何真正工作的,因此我不要求等效代码做同样的事情。因此,如果你有其他棘手的例子,我也感兴趣 package { import flash.display.Sprite; public cl

我尝试执行下面的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

您的
x
变量存在于与您从
S2.f()返回的
x
不同的范围内

S2
扩展了
Sprite
,而Sprite又扩展了
DisplayObject
,后者已经有了一个x属性。
这就是你要回来的

如果将变量名更改为类似于
myX
的名称,则会出现预期的错误

执行此操作将更改返回的内容:

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

这是正确的!谢谢为了遵守语言规范,这是唯一的答案,但我只是忘记了对于一个如此简单的程序已经有很多超类。还有一件事:没有“-debug”选项编译的同一个程序会导致“堆栈下溢”错误(linux上使用flex45 sdk)。生成的字节码做了一些非常奇怪的事情(包括空操作数堆栈上的pop…),在这种情况下,您在编译时是否已经遇到过这样的问题?这是编写actionscript代码的一种相当不标准的方法,我真的很惊讶它甚至可以在类声明之后使用代码。如果您添加另一个类并将代码放入它的构造函数中,您应该会有更好的运气。我知道这不是编写代码的标准方式,无论如何,总是有代码在这个级别执行(字节码中的脚本级别)。在类声明之后没有任何代码,至少有用于创建定义为脚本属性(更准确地说是脚本的全局对象)的类的代码。因为我的最终目标是分析字节码,所以我必须考虑代码的这一部分,编译器似乎不允许在这个级别编写代码。奇怪的是,编译器在没有抱怨的情况下生成无效代码,并且只有当debug标志被禁用时,才会有一个内部类用于放置代码,但我同意允许其他代码并生成无效字节码是非常奇怪的。我得说你发现了一个编译器错误!