Функции определяют повторяющиеся участки кода, или обычные операции в
ActionScript. Создавая функцию, вы можете повторять одну и ту же
операцию множество раз без необходимости заново писать один и тот же
код каждый раз, когда вы хотите ее использовать. Вместо этого, все, что
вам нужно сделать - это вызвать функцию, используя ее имя.
В ActionScript функции определяются двумя способами. Вы можете создать
именованную Функцию, используя форму function [functionName]
([parameters]) { [code] }, или можете определить безымянную функцию,
используя var [functionName] = function ([parameters]) { [code] }.
Именованные функции создают определения функции или метода, в то время
как неименованные функции содержат переменные, которые ссылаются на
«свободно меняющееся» определение функции. // Named function function doubleNumber(num) { return num*2; } // Same function defined as an anonymous function // defined within the variable doubleNumber var doubleNumber = function(num) { return num*2; } В
приведенном выше примере создается функция с именем doubleNumber,
которая принимает единственное числовое значение и возвращает это
значение, умноженное на два. Для использования функции нужно вызвать,
используя круглые скобки (()).
var x:Number = 10; trace(doubleNumber(x)); // traces 20 Как
и в случае с переменными, именованные функции не могут быть определены
более одного раза для любой данной временной шкалы в ActionScript 3.
Неименованные функции по прошествии времени могут ссылаться на
множество функций, но не могут быть переопределены с помощью var, так
как по существу они являются переменными. ActionScript 2 позволял
изменять любое определение функции в любой момент. В ActionScript 3
можно менять только определение неименованных функций. При
назначении функциям типов, определяйте информацию о типах как для
параметров в списке (разделенный запятой список значений, с помощью
которых поддерживается функция), так и для возвращаемого значения, или
значения, которое поддерживается функцией после запуска. При
использовании определения неименованной функции, переменной, которой
назначается функция, также будет присвоен тип Function (функция). // Named function function doubleNumber(num:Number):Number { return num*2; } // Same function defined as an anonymous function var doubleNumber:Function = function(num:Number):Number { return num*2; } Если
функция не возвращает значения, тогда ее возвращаемый тип должен быть
void. Когда запускается функция с типом void, или если функция просто
не может вернуть значение с помощью оператора return, то ее
возвращаемое значение становится неопределенным. function returnsNothing():void { // do nothing } trace(returnsNothing()); // traces undefined Названная
выше функция returnsNothing не только ничего не возвращает, но также и
не принимает никаких значений – у нее нет списка параметров. Если вы
пытаетесь ввести значения в функцию, когда она не имеет списка
параметров, определенного для нее в ActionScript 3, вы получите
сообщение об ошибке. returnsNothing(3); // Error: Incorrect number of arguments В
ActionScript 2, тип Void использовался в качестве списка параметров при
определении функции, чтобы показать отсутствие параметров. В
ActionScript 3 вы просто оставляете список пустым. Использование типа
Void в списке параметров в ActionScript 3 фактически заставит Flash
думать, что переменная, названная Void, определена для списка
параметров этой функции. Примечание: параметры в сопоставлении с аргументами Разница
между параметрами и аргументами заключается в том, что параметры
находятся в значении, используемом для определения функции. Аргументы –
это фактические значения, предоставляемые функции во время ее
использования. Вы можете видеть аргументы в качестве значений
параметров. С помощью ActionScript 3 вы теперь также можете определять для своих функций значения по умолчанию. // Here, message parameter is optional function usesDefault(message:String = "hello"):void { trace(message); } usesDefault("test"); // traces "test" usesDefault(); // traces "hello" Используя
значения по умолчанию, вы не только получаете возможность назначить
значения для параметров, не используемых процедурой вызова функции, но
также они позволяют вам определить функции с дополнительными
параметрами, или параметрами, которые не нужно использовать. Параметры,
у которых нет значений по умолчанию, должны предоставляться при вызове
функции в ActionScript 3. В связи с этим, все дополнительные параметры
должны быть определены в конце списка параметров. Ситуация, когда
требуемый параметр определен после дополнительного параметра,
недопустима. // Error: Required parameters are not // permitted after optional parameters function usesDefault(message:String = "hello", num:Number):void { // code } // Correct; usesDefault needs at // least 1 argument, accepts 2 at max function usesDefault(num:Number, message:String = "hello"):void { // code } Как
быть, если вы захотите позволить вызов функции с любым числом
аргументов? В ActionScript 2 вы могли сделать это, просто опустив любой
список параметров и сославшись на аргументы с использованием объекта
arguments в функции. В ActionScript 3 отсутствие списка параметров
означает, что функция не может быть вызвана с любыми аргументами.
Вместо этого, вам следует использовать новый тип параметра, известный
как …(rest). Этот параметр идет в конце вашего списка параметров (или
он может представлять ваш полный список параметров) и показывает, что
любое число аргументов может использоваться при вызове функции.
Параметр …(rest) записывается как …argumentsArrayName, где
argumentsArrayName – это имя массива, который будет содержать прошедшие
аргументы. // Using the ...(rest) parameter function passAnything(...statements):void { trace(statements.length +": "+ statements); } passAnything(); // traces 0: passAnything(1); // traces 1: 1 passAnything("a", true, 0); // traces 3: a,true,0 Примечание: доступ к caller и callee При
использовании параметра …(rest), объект arguments не доступен вызову
функции. Вместо этого, параметр …(rest) должен использоваться для
получения прошедших аргументов. В отличие от arguments, …(rest), тем не
менее, не имеет свойства caller, используемого для ссылки на текущую
функцию. В ActionScript 3 ни arguments, ни …(rest) не имеют свойства
callee, используемого для ссылки на функцию, вызывающую текущую функцию
(свойство callee было доступно в объекте аргументов в ActionScript 2,
но было удалено в ActionScript 3).
|