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