我尝试执行以下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
答案 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