有些方法使用它有些不使用,显然这是由 needsActivation 标志指定的,坚果它做什么以及何时使用它以及何时不使用它?
AVM 文档上的信息有些粗鲁:
创建一个新的激活对象 newactivation,并将其推入堆栈。只能用于在 MethodInfo 条目中设置了 NEED_ACTIVATION 标志的方法。
有些方法使用它有些不使用,显然这是由 needsActivation 标志指定的,坚果它做什么以及何时使用它以及何时不使用它?
AVM 文档上的信息有些粗鲁:
创建一个新的激活对象 newactivation,并将其推入堆栈。只能用于在 MethodInfo 条目中设置了 NEED_ACTIVATION 标志的方法。
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.