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
这是正确的!谢谢。这是符合语言规范的唯一答案,但我忘记了这么简单的程序已经有很多超类。 –
只是另一件事:没有“-debug”选项编译相同的程序会导致“堆栈下溢”错误(与在Linux上的flex45 sdk)。生成的字节代码真的很奇怪(包括在空操作数堆栈上弹出......),在编译过程中是否已经遇到过这样的问题? –
这是一个非常不规范的编写actionscript代码的方式,我真的很惊讶它甚至可以在类声明之后的代码中运行。如果你添加了另一个类,并把它放在它的构造函数中,你应该有更好的运气。 – grapefrukt