在ActionScript Bytecode中,NewActivation是什么意思?

时间:2011-03-23 01:12:42

标签: actionscript-3 bytecode avm2

有些方法使用它有些没有,显然是由needsActivation标志指定的,它做什么以及何时使用它以及什么时候不用?

关于AVM文档的信息有点不合理:

创建一个新的激活对象newactivation,并将其推送到堆栈中。只能在MethodInfo条目中设置了NEED_ACTIVATION标志的方法中使用。

1 个答案:

答案 0 :(得分:4)

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.