先编码
import flash.display.Sprite;
import flash.events.Event;
public class TestClosure extends Sprite
{
private var a:Object = {'value':'test'}
public function TestClosure()
{
this.addEventListener(Event.ADDED_TO_STAGE,
function (e:Event):void
{
trace(a.value);//this works
// trace(this.a.value);this won't work
}
);
}
}
如您所见,访问实例属性 a 而不使用“this”关键字将成功。
所以这是我的猜测,我不知道它是否正确。
创建闭包函数时,编译器会查找范围变量并创建对它的引用。
使用 a.value 会导致编译器在函数范围内寻找 a,当然 var a 是一个私有变量,它在函数范围内可用。
使用 this.a.value,编译器将跳过“this”,因为它在许多情况下是动态的,只能在运行时确定。正如闭包函数“this”引用全局而不是他的实例。
感谢您的任何提示。