Actionscript 3 访问脚本变量属性的意外行为
我尝试执行下面的actionscript3程序,对调用f()函数的结果感到惊讶。我原以为f()的结果是“1”或至少是“未定义”,但“0”值对我来说毫无意义 如果你有这样的行为,我会很高兴有一个很好的解释,或者知道你是否认为这种行为是“正常的”。 我想确切地说,我正在研究动作脚本程序的行为,以了解AVM2是如何真正工作的,因此我不要求等效代码做同样的事情。因此,如果你有其他棘手的例子,我也感兴趣Actionscript 3 访问脚本变量属性的意外行为,actionscript-3,bytecode,avm2,Actionscript 3,Bytecode,Avm2,我尝试执行下面的actionscript3程序,对调用f()函数的结果感到惊讶。我原以为f()的结果是“1”或至少是“未定义”,但“0”值对我来说毫无意义 如果你有这样的行为,我会很高兴有一个很好的解释,或者知道你是否认为这种行为是“正常的”。 我想确切地说,我正在研究动作脚本程序的行为,以了解AVM2是如何真正工作的,因此我不要求等效代码做同样的事情。因此,如果你有其他棘手的例子,我也感兴趣 package { import flash.display.Sprite; public cl
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标志被禁用时,才会有一个内部类用于放置代码,但我同意允许其他代码并生成无效字节码是非常奇怪的。我得说你发现了一个编译器错误!