4

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

AVM 文档上的信息有些粗鲁:

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

4

1 回答 1

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.
于 2011-03-23T05:43:32.153 回答