2011-12-31 199 views

回答

4

如果你的意思是這樣的:

public class MyClass { 
    public function MyClass() { 
     function myFunction() : void { 
     } 
    } 
} 

則主要區別是,不僅知名度,但範圍:myFunction()被聲明爲一個臨時的功能,這隻能從同一個方法中調用。完成構造函數的執行後,該函數將被丟棄並進行垃圾回收,就像任何臨時變量一樣。你可以很容易地驗證這一點:只需添加一個「常規」成員函數,並嘗試從那裏調用myFunction() - 編譯將失敗。所以,當然會嘗試從另一個類訪問函數。

如果您指的是將函數聲明爲變量並從構造函數中初始化它,主要區別在於類型安全性。

考慮這個標準聲明:

public class MyClass { 
    public function myFunction (param1:String) : String { 
     // doSomething 
     return myString; 
    } 
    public function MyClass() { 
    } 
} 

我們已經宣佈了嚴格的類型參數,並嚴格類型返回類型的成員函數。如果我們試圖以不符合聲明的方式訪問這個函數,編譯器會拋出一個錯誤,編譯將失敗,就像人們所期望的那樣。

現在從構造方法中相同的聲明:

public class MyClass { 
    public var myFunction : Function; 
    public function MyClass() { 
     myFunction = function (param1:String) : String { 
      // doSomething 
      return myString; 
     } 
    } 
} 

我們已經宣佈被初始化做同樣的事情上面成員函數型功能的嚴格類型成員變量。

myClassInstance.myFunction ("whatever", "and", "some", "more"); 

編譯器不會抱怨:如果,例如,您嘗試訪問該函數指定的參數太多 - 但它的嚴格類型參數和返回值類型是由編譯器只申報的範圍內評估,因爲參數和返回類型現在只在運行時檢查,而不是在編譯時檢查(當然,仍然會出現錯誤)。所以這種方法的主要缺點是缺少編譯時類型檢查 - 錯誤會在運行時發生,因此很難調試。這種方法的

一個好處是,我們可以隨時交流這方面的功能:

myClassInstance.myFunction = function (i:int) : void { trace (i); }; 

這是完全合法和顯然會顯著改變對象的行爲。如果我們會在成員函數示例中做同樣的事,編譯器也會拋出一個錯誤。

+0

謝謝你詳細介紹各方面!它幫助我更好地理解我在做什麼以及爲什麼要這樣做。 – IneedHelp 2011-12-31 13:37:22

+0

另外,類方法也是綁定函數,而屬性函數不是。 – 2012-01-01 17:51:10