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

时间:2011-11-07 13:25:49

标签: actionscript-3 bytecode avm2

我尝试执行以下actionscript3程序,我对调用f()函数的结果感到惊讶。我期待f()的结果是“1”或至少是“未定义”,但“0”值对我没有任何意义。

如果你有一个,或者你知道你是否认为这种行为是“正常的”,我会很高兴对这种行为有一个很好的解释。 我想要准确地说我正在研究Action Script程序的行为,以便了解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 个答案:

答案 0 :(得分:1)

您的x变量的范围与您从x

返回的S2.f()不同

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

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

这样做会改变返回的内容:

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