2012-08-08 49 views
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 
       } 
      ); 
     } 
    } 

因此,大家可以看到,访问实例属性没有“this”关键字会成功。

所以这里是我的猜测,我不知道它是否正确。

创建闭包函数时,编译器寻找范围变量并创建对其的引用。

使用a.value使编译器寻找一个函数作用域,当然,var a是一个私有变量,它在函数作用域中可用。

使用this.a.value,编译器会跳过“this”,因为它在许多情况下是动态的,只能在运行时确定。正如关闭函数中的“this”引用全局而不是他的例子。

感谢您的任何提示。

回答

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 
     } 
    ); 
} 

为你改变a到一个公共变量,或者做一个getter函数为它的线trace(me.a.value);将尽快工作。

+0

感谢您的回答,上面我的帖子中的函数可以访问私有变量而不使用这个或将其分配给另一个局部变量 – davyzhang 2012-08-08 11:49:33

+0

这是正确的,但后来我想我并不真正了解您的原始问题,如果获得对封闭实例的引用不是你的目标。你正确地发现'this'是指闭包中的全局范围。那么问题是什么? – frankhermes 2012-08-08 18:18:01

+0

你是对的,我的目标和我实现它,而不是像你在你的代码中那样分配给另一个变量。所以问题是背后的理论是什么?我有我的猜测,但我不知道如果它是正确的 – davyzhang 2012-08-09 03:32:55