Actionscript 3 在ActionScript字节码中,新激活意味着什么?
有些方法使用它,有些不使用,显然这是由needsActivation标志指定的,它做什么,何时使用,何时不使用 关于AVM文档的信息有些不全面:Actionscript 3 在ActionScript字节码中,新激活意味着什么?,actionscript-3,bytecode,avm2,Actionscript 3,Bytecode,Avm2,有些方法使用它,有些不使用,显然这是由needsActivation标志指定的,它做什么,何时使用,何时不使用 关于AVM文档的信息有些不全面: 创建一个新的激活对象newactivation,并将其推送到堆栈上。只能用于在MethodInfo条目中设置了“需要”激活标志的方法。AVM 2概述的第6.3节中有很好的描述: 由于 当 执行newfunction指令, 非叶函数的环境 必须存储在激活对象中 这是可以正确捕捉的。这个 newactivation指令创建这样的 激活 当方法中定义了一个局
创建一个新的激活对象newactivation,并将其推送到堆栈上。只能用于在MethodInfo条目中设置了“需要”激活标志的方法。AVM 2概述的第6.3节中有很好的描述: 由于 当 执行newfunction指令, 非叶函数的环境 必须存储在激活对象中 这是可以正确捕捉的。这个 newactivation指令创建这样的 激活 当方法中定义了一个局部函数时,会在方法中使用它,例如:
public function QuickTest()
{
startTimer(1);
startTimer(2);
}
public function startTimer(id:int):void
{
var timer:Timer = new Timer(1000, 1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, function(ev:TimerEvent):void
{
trace('Timer #'+id+' done.');
});
timer.start();
}
其结果是:
Timer #1 done.
Timer #2 done.
您可以看到,在调用该方法时,局部变量和参数被“锁定”。这是因为startTimer方法在每次运行时都会创建一个激活,这就是那些变量被锁定的地方。如果未锁定局部变量,则此代码的结果将是:
Timer #2 done.
Timer #2 done.
好吧,也许我应该先问一下什么是“激活”。因为在对新激活的描述中,他们说“因为激活的本地寄存器…”。那么ABC术语中的激活是什么呢?@ska据我所知,它基本上是一个包含局部变量作为属性的对象。object?AVM不是更多地使用堆栈和寄存器而不是对象吗?我想这就是全部的想法。这可能类似于在Unix NASM中,在Unix控制机器指令程序之前,必须将寄存器推送到(某些)堆栈上。但在Unix中,这是很好的解释和逻辑。无论如何,谢谢你的帖子,我会去挖掘更多。实际上没有“更多的堆栈”或“更多的对象”,但你是在寻找技术描述,还是想了解它是什么?如果您需要技术说明,请参阅AVM 2概述。如果你想知道如何思考它,可以把它看作是一个包含局部变量的对象。