2011-12-31 184 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