2012-08-08 25 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