Если вы имеете в виду это:
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;
}
}
}
Мы объявили строго типизированную переменную-член типа Function , которая инициализируется так же, как и функция-член выше. Но его строго типизированный параметр и тип возвращаемого значения оцениваются компилятором только в пределах области объявления - если, например, вы пытаетесь получить доступ к функции, указывающей слишком много параметров:
myClassInstance.myFunction ("whatever", "and", "some", "more");
компилятор не будет жаловаться, потому что и параметр, и тип возвращаемого значения теперь проверяются только во время выполнения, а не во время компиляции (конечно, все равно будет ошибка). Таким образом, основным недостатком этого подхода является отсутствие проверки типов во время компиляции - ошибки будут возникать во время выполнения, и, следовательно, их будет сложнее отлаживать.
Одним из преимуществ этого подхода является то, что мы можем заменить эту функцию в любое время:
myClassInstance.myFunction = function ( i:int ) : void { trace (i); };
Это совершенно законно и, очевидно, значительно изменит поведение объекта. Если мы сделаем то же самое в примере функции-члена, компилятор также выдаст ошибку.