1

先编码

    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”引用全局而不是他的实例。

感谢您的任何提示。

4

1 回答 1

0

正如你所说,闭包函数this是指全局而不是局部范围。但是在另一个变量中创建引用this将起作用:

public function TestClosure()
{
    var me:TestClosure = this;

    this.addEventListener(Event.ADDED_TO_STAGE,
         function (e:Event):void
         {
             trace(a.value);//this works
             trace(me.a.value); //this will work provided a is a public var
         }
    );
}

trace(me.a.value);一旦您更改a为公共变量或为其创建 getter 函数,该行将立即工作。

于 2012-08-08T09:30:09.793 回答