Январь 2011

Руководство по actionscript. часть 1, стр. 090

При работе с константными переменными экземпляра, если программа откомпилирована в строгом режиме, после того как значение значение, указанное в инициализаторе переменной, будет присвоено переменной, изменить ее будет невозможно. Если программа откомпилирована в стандартном режиме, то после того,

как значение значение, указанное в инициализаторе переменной, будет присвоено переменной, изменить ее можно будет внутри функции конструктора того класса, в котором она объявлена, — после этого изменить значение переменной будет невозможно (различия между строгим и стандартным режимами компиляции будут рассмотрены в гл. 7).

Константы обычно используются для создания статических переменных, чьи фиксированные значения описывают варианты определенной настройки программы. Предположим, мы создаем программу будильника для ежедневной подачи сигнала. Подача сигнала может происходить в трех режимах: визуальном (моргающий значок), звуковом (зуммер) или визуальном и звуковом одновременно. Будильник представлен классом с именем AlarmClock. Для представления трех режимов подачи сигнала в классе Al armCl ос к определены три константные статические переменные: MODE_VISUAL, MODE_AUDIO и MODE_BOTH. Каждой константе присвоено числовое значение, определяющее соответствующий режим. Режим 1 считается визуальным, режим 2 — звуковым, а режим 3 — визуальным и звуковым одновременно. В следующем примере кода продемонстрированы описания констант режимов:

public class AlarmClock { public static const MODE_VISUAL = 1; public static const M0DE_AUDI0 = 2; public static const M0DE_B0TH = 3:

}

В классе AlarmClock определена переменная экземпляра mode, которая позволяет хранить информацию о выбранном режиме для каждого экземпляра этого класса. Чтобы задать режим для объекта AlarmClock, необходимо присвоить одно из константных значений режимов (1,2 или 3) переменной экземпляра mode. Следующий код устанавливает звуковой режим (режим 2) в качестве режима по умолчанию для новых объектов AlarmClock:

Руководство по actionscript. часть 1, стр. 091

Public class AlarmClock { public static const MODEJISUAL = 1; public static const M0DE_AUDI0 = 2; public static const M0DE_B0TH = 3;

private var mode = AlarmClock. M0DE_AUDI0;

}

Когда наступает время подачи сигнала, объект AlarmClock выполняет соответствующее действие в зависимости от текущего режима. Следующий код демонстрирует один из способов того, как объект AlarmClock мог бы использовать константы режимов для выбора подходящего действия:

public class AlarmClock { public static const MODEJISUAL = 1; public static const M0DE_AUDI0 = 2; public static const M0DE_B0TH = 3;

private var mode = AlarmClock. MODE_AUDIO;

private function signalAlarm ( ) { if (mode — MODEJISUAL) {

// Отобразить значок } else if (mode — M0DE_AUDI0) {

// Воспроизвести звук } else if (mode — M0DEB0TH) {

// Отобразить значок и воспроизвести звук

>

}

}

Обратите внимание, что в предыдущем коде использование констант режимов с технической точки зрения не является обязательным. Собственно говоря, мы могли бы решить эту задачу с помощью константных числовых значений (магических значений). Тем не менее при использовании констант назначение числовых значений становится гораздо более понятным. Для сравнения, следующий код демонстрирует класс AlarmClock, реализованный без констант. Обратите внимание, что без комментариев в коде определить назначение каждого из трех значений режимов было бы достаточно сложно:

public class AlarmClock { private var mode = 2;

private function signalAlarm ( ) { if (mode == 1) {

// Отобразить значок } else if (mode == 2) {

// Воспроизвести звук } else if (mode == 3) {

// Отобразить значок и воспроизвести звук

}

}

}

Теперь познакомимся с партнерами статических переменных — статическими методами.

Статические методы

В предыдущем разделе мы узнали, что статические переменные используются для хранения информации, которая относится ко всему классу. Подобным образом статические методы описывают функциональность, относящуюся ко всему классу, а не к отдельному экземпляру этого класса. Например, в состав API среды выполнения Flash входит класс Point, представляющий точку с координатами по оси X и по оси Y в декартовой системе координат. В классе Point определен статический метод polar ( ), который позволяет получить объект Point по заданной точке в полярной системе координат (то есть по расстоянию и углу). Преобразование точки в полярной системе координат в точку в декартовой системе координат является общей операцией, относящейся к точкам в декартовом пространстве вообще, а не к отдельному объекту Point. Именно поэтому данный метод определен как статический.

Статические методы

121

Как и методы экземпляра, статические методы создаются описанием функций внутри описаний классов, однако описания статических методов должны также включать атрибут static, как показано в следующем обобщенном коде:

class НекийКласс { static function имяМетода (идентификатор! = значение!,

идентификатор2 = значение2,

идентификатора = значениеп) {

}

}

Как и в случае с методами экземпляра, управлять доступностью статических методов в программе можно с помощью модификаторов управления доступом. В описаниях статических методов применяются те же модификаторы управления доступом, что и в описаниях методов экземпляра: public, internal, protectednprivate. Если при описании метода не указан никакой модификатор доступа, то используется модификатор internal (доступ внутри пакета). При описании статического метода модификатор доступа обычно размещается перед атрибутом static, как показано в следующем обобщенном коде:

Руководство по actionscript. часть 1, стр. 092

Class НекийКласс { public static function имяМетода (идентификатор! = значение!,

идентификатор2 = значение2

идентификаторп = значениеп) {

}

}

Для вызова статического метода используется следующий обобщенный код:

НекийКласс. имяМетода(значение1, значение2. ..значениеп)

В предыдущем коде НекийКласс обозначает класс, в котором определен статический метод, имяМетода — это имя статического метода, а значение!, значение2. . . значениеп — список, состоящий из нуля или более аргументов метода. Внутри класса, в котором определен данный метод, имя имяМетода может быть использовано самостоятельно (без лидирующего имени класса и точки). Например, в классе А, в котором определен статический метод т, выражение А. т ( ) идентично выражению m ( ). Тем не менее, чтобы различать статические методы и методы экземпляра, многие разработчики (это относится и к примерам данной книги) включают лидирующее имя класса[ даже в тех случаях, когда его использование не является обязательным.

Некоторые классы существуют только ради определения статических методов, объединяя связанную функциональность, однако экземпляры таких классов никогда не создаются. Например, собственный класс Mouse существует только ради определения статических методов show ( ) и hide ( ) (используются для отображения или скрытия указателя мыши). Обращение к этим статическим методам происходит непосредственно через класс Mouse (как, например, Mouse. hide ( ) ), а не через экземпляр данного класса. Объекты класса Mouse никогда не создаются.

У статических методов есть два ограничения, которые отсутствуют у методов экземпляра. Во-первых, в методе класса нельзя использовать ключевое слово this.

Во-вторых, статический метод не может обращаться к переменным и методам экземпляра класса, в котором он определен (в отличие от методов экземпляра, которые, помимо переменных и других методов экземпляра, могут также обращаться к статическим переменным и статическим методам).

В целом, статические методы по сравнению со статическими переменными используются не часто. В нашей программе по созданию виртуального зоопарка статические методы не применяются вообще. Чтобы продемонстрировать применение статических методов на практике, вернемся к функции проверки адресов электронной почты, описанной в гл. 2. В этой функции мы создали цикл, который позволяет определить наличие или отсутствие символа @ в указанном адресе электронной почты. Теперь представим, что в результате активного развития нашего приложения было решено создать служебный класс для работы со строками. Назовем его StringUtils. Класс StringUtils не будет использоваться для создания объектов; он просто представляет коллекцию статических методов. В качестве примера мы определим один статический метод contains ( ), возвращающий значение типа Boolean — это значение определяет, содержит ли указанная строка выбранный символ. Рассмотрим код:

Руководство по actionscript. часть 1, стр. 093

Public class StringUtils { public function contains (string, character) { for (var i:int = 0; i <= string.length: i++) { if (string.charat(i) == character) { return true;

}

}

return false;

}

}

В следующем примере кода показано, как наше приложение могло бы использовать метод contains( ), чтобы проверить, содержит ли указанный адрес электронной почты символ @:

StringLIti 1 s. contains(«me@moock. org», «@»);

Конечно, в реальном приложении адрес электронной почты вводил бы сам пользователь и метод contains ( ) определял бы допустимость отправки формы на сервер. Следующий код демонстрирует более реалистичную ситуацию:

if (StringUtils. contains(userEmai1, «@»)) { // Этот код отправлял бы форму на сервер } else {

// Этот код отображал бы сообщение «Неправильные данные» для пользователя

}

Помимо статических методов, которые создаются вручную, среда выполнения Flash автоматически создает для каждого класса один статический метод, называемый инициализатором класса. Познакомимся с ним поближе.

Инициализатор класса. После определения класса на этапе выполнения программы среда Flash автоматически создает и исполняет метод, называемый инициализатором класса. В нем среда Flash размещает все инициализаторы статических

переменных данного класса и весь код уровня класса, не относящийся к описаниям переменных или методов.

Инициализатор класса предоставляет возможность выполнять однократные задачи настройки сразу после определения класса, вызывая методы или обращаясь к переменным, являющимся внешними по отношению к текущему классу. Предположим, что мы создаем приложение для чтения электронной почты и хотим, чтобы внешний вид этого приложения соответствовал графическому стилю операционной системы. Чтобы определить, какая графическая тема должна быть использована в почтовом клиенте, в инициализаторе основного класса приложения Mail Reader проверяется текущая операционная система и присваивается соответствующее значение статической переменной theme. Переменная theme хранит информацию о графической теме, используемой в данном приложении. В следующем коде продемонстрирован инициализатор для класса Mail Reader. Для проверки операционной системы в классе MailReader используется статическая переменная os, определенная всобственном классе flash, system. Capabilities.

package { import flash. system.*;

public class MailReader { static var theme; if (Capabilities. os == «MacOS») {

theme = «MAC»; } else if (Capabilities. os == «Linux») {

theme = «LINUX»; } else {

theme = «WINDOWS»;

}

}

}

Код, размещаемый в инициализаторе класса, выполняется в режиме интерпретации, и JIT-компилятор не компилирует его. Динамически откомпилированный код выполняется гораздо быстрее интерпретируемого кода, поэтому в тех случаях, когда на первом месте стоит вопрос производительности, код, интенсивно использующий ресурсы процессора, следует выносить за пределы инициализатора класса.

Объекты Class

Как мы уже знаем, обращение к каждому статическому методу и к каждой статической переменной осуществляется через класс, в котором они определены. Например, для обращения к статической переменной maxCalories, заданной в классе VirtualPet, мы применяем следующий код:

Virtual Pet. maxCalories

Использование имени класса VirtualPet в предыдущем коде является не просто особенностью синтаксиса; на самом деле имя класса VirtualPet ссылается

на объект, в котором определена переменная maxCalories. Объект, на который ссылается имя класса VirtualPet, является автоматически создаваемым экземпляром собственного класса Class.

Во время выполнения программы каждый класс в языке ActionScript представляется экземпляром класса Class. С точки зрения программиста, объекты Class используются в основном для доступа к статическим переменным и методам класса. Тем не менее, как и любые другие объекты, они являются значениями которые могут быть присвоены переменным, переданы или возвращены из методов и функций. Например, в следующей модифицированной версии нашегс класса VirtualPet переменной vp присваивается объект Class, представляющий класс VirtualPet, после чего эта переменная используется для создания объекта VirtualPet:

Руководство по actionscript. часть 1, стр. 094

Package zoo { public class VirtualZoo { private var pet;

public function VirtualZoo ( ) { var vp = VirtualPet; pet = new vpCStan»);

}

}

}

Описанная методика применяется в тех случаях, когда один SWF-файл желает обратиться к классам другого SWF-файла или когда мультимедийные элементы (например, изображения или шрифты) размещаются в другом SWF-файле. Обе описанные ситуации будут рассмотрены в части II.

Наше знакомство со статическими переменными и методами подошло к концу. Но перед тем, как перейти к следующей главе, сравним рассмотренные понятия с понятиями, применяемыми в языках С++ и Java.

Сравнение с терминологиями языков С++ и Java

Концепции переменных экземпляра, методов экземпляра, статических переменных и статических методов присутствуют в большинстве объектно-ориентированных языков программирования. Для сравнения в табл. 4.1 перечислены эквивалентные понятия, применяемые в языках Java и С++.

Таблица 4.1. Сравнение терминологий

ActionScript Java С++

Переменная экземпляра Поле или переменная экземпляра Член данных

Метод экземпляра Метод Функция-член

Статическая переменная Переменная класса Статический член данных

Статический метод Метод класса Статическая функция-член

К функциям

Как мы уже знаем, методы экземпляра определяют поведение, которое относится к отдельному объекту, а статические методы — поведение, относящееся к отдельному классу. В следующей главе мы познакомимся с функциями, которые определяют независимые поведения, не относящиеся ни к объектам, ни к классам.

ЩАМ S

Функции

Функция, или замыкание функции, — это дискретный набор инструкций, выполняющих определенную задачу независимо от других классов или объектов. Для описания и использования замыканий функций применяется такой же базовый синтаксис, как и для методов экземпляра и статических методов. Функции описываются с помощью ключевого слова function и вызываются с помощью оператора круглых скобок, при необходимости функции могут возвращать значение, а внутри тела могут определяться локальные переменные. Тем не менее, в отличие от методов экземпляра (которые всегда связаны с объектом) и статических методов (которые всегда связаны с классом), замыкания функций создаются и используются самостоятельно либо в виде подзадачи в методе, либо в виде полезной процедуры, доступной в пакете или в любом месте программы.

я л

Говоря на строгом профессиональном жаргоне спецификации языка ActionScript 3.0, м$ J, и замыкания функций, и методы являются разновидностями функций, при этом термин «функция» вообще относится к вызываемому объекту, представляющему собой набор инструкций. Таким образом, замыкание функции является функцией, не связанной с объектом или классом, а метод — функцией, связанной с объектом (в случае с методами экземпляра) или классом (в случае со статическими методами). Тем не менее в лексиконе программистов и в подавляющем большинстве документации вместо термина «замыкание функции» используется его сокращенный вариант — «функция». Если вы не читаете спецификацию языка ActionScript 3.0 или текст, в котором указано обратное, можете смело предполагать, что функция означает замыкание функции. В оставшейся части этой книги термин «функция» обозначает замыкание функции, если не указано другое.

Для создания функции используется следующий обобщенный код, размещаемый в одном из перечисленных мест: внутри метода, непосредственно внутри описания пакета, непосредственно за пределами описания пакета или внутри другой функции. Обратите внимание, что используемый для описания функции код идентичен коду, применяемому для описания обычного метода экземпляра. На самом деле, если следующий код размещается непосредственно внутри тела класса, создается метод экземпляра, а не функция.

Руководство по actionscript. часть 1, стр. 095

Function идентификатор (параметр!, параметр2… параметра) { }

В этом коде идентификатор обозначает имя функции, а параметр!, параметр2. . . параметра — необязательный список параметров функции, которые используются точно так же, как и параметры метода, рассмотренные в гл. 1. Фигурные скобки, следующие за списком параметров, определяют начало и конец тела функции, содержащего инструкции, выполняемые при ее вызове.

Для вызова функции применяется следующий обобщенный код:

функция (значение!, значение2. .. значениеп)

В данном коде функция обозначает имя вызываемой функции, а значение!, значе-ние2. . . значениеп — список аргументов, которые связаны по порядку с параметрами функции функция.

Функции уровня пакета

Чтобы функция была доступна в пакете или в любой точке программы, ее описание должно размещаться непосредственно внутри тела пакета. Чтобы ограничить доступ к функции только тем пакетом, в котором она описана, перед описанием функции нужно указать модификатор управления доступом internal, как показано в следующем коде:

package имяПакета { internal function идентификатор ( ) {

Чтобы функция была доступна в любой точке программы, перед описанием функции нужно указать модификатор управления доступом public, как показано в следующем коде:

package имяПакета { public function идентификатор ( ) {

Если никакой модификатор управления доступом не указан, то компилятор языка ActionScript автоматически использует модификатор internal.

3*4

Компиляторы, разработанные корпорацией Adobe, налагают два требования, затрагивающие функции уровня пакета, на исходные файлы (AS-файлы) программ, написанных Зу на языке ActionScript.

Каждый исходный файл (AS-файл) программы должен содержать только одно описание, видимое извне. Это может быть описание класса, переменной, функции, интерфейса или пространства имен, определенное внутри тела пакета либо с помощью модификатора internal, либо с помощью модификатора public.

Имя каждого исходного файла программы должно совпадать с именем единственного видимого извне описания, которое содержится в этом файле.

Таким образом, если теоретически язык ActionScript и не налагает никаких ограничений на функции уровня пакета, то на практике компиляторы, разработанные корпорацией Adobe, требуют, чтобы каждая функция уровня пакета была определена либо с помощью модификатора internal, либо с помощью модификатора public и размещена в отдельном AS-файле, имя которого должно совпадать с именем функции. Дополнительную информацию об ограничениях, налагаемых компиляторами, можно найти в разд. «Ограничения компиляторов» гл. 7.

Руководство по actionscript. часть 1, стр. 096

Следующий код создает функцию уровня пакета i sMa с ( ), возвращающую значение типа Boolean, которое указывает, является ли Macintosh текущей операционной

системой. Поскольку в описании функции i sMac ( ) указан модификатор управления доступом internal, эта функция будет доступна только внутри пакета utilities. Как было отмечено ранее, если для компиляции используется один из компиляторов, разработанных корпорацией Adobe, следующий код необходимо поместить в отдельный AS-файл с именем isMac. as.

package utilities { import flash. system.*;

internal function isMac ( ) { return Capabilities. os == «MacOS»;

}

}

Чтобы функция isMac ( ) была доступна за пределами пакета utilities, необходимо заменить модификатор internal модификатором public, как показано в следующем коде:

package utilities { import flash. system.*:

public function isMac ( ) { return Capabilities. os == «MacOS»:

}

}

Тем не менее, чтобы иметь возможность использовать функцию isMac ( ) за пределами пакета utilities, ее сначала необходимо импортировать. Предположим, что функция isMac ( ) является частью большой программы с классом Welcome, входящим в пакет setup. Чтобы воспользоваться этой функцией в классе Welcome, в исходный файл этого класса должна быть импортирована функция utilities. isMac ( ), как показано в следующем коде: package setup {

// Импортировать функцию isMac( ). чтобы ее можно было использовать // внутри тела этого пакета import utilities. isMac;

public class Welcome { public function Welcome ( ) { // Воспользоваться функцией isMac( ) if (isMac( )) { // Выполнить специфические для Macintosh действия

}

}

}

}

Глобальные функции. Функции, определенные на уровне пакета и размещаемые внутри пакета без имени, называются глобальными, поскольку обращаться к ним можно глобально, из любой точки программы без необходимости использования оператора import. Например, следующий код определяет глобальную функцию isLinux ( ). Поскольку функция is Linux ( ) находится внутри пакета без имени, к ней можно обращаться из любого места кода данной программы.

Руководство по actionscript. часть 1, стр. 097

Package { import flash. system.*;

public function isLinux ( ) { return Capabilities. os == «Linux»;

}

}

Следующий код демонстрирует модифицированную версию класса Welcome из предыдущего раздела, в котором вместо функции isMac ( ) используется функция isLinux ( ). Обратите внимание, что перед применением функцию импортировать не нужно.

package setup { public class Welcome { public function Welcome ( ) { // Воспользоваться функцией isLinux( ) if (isLinux( )) { // Выполнить специфические для Linux действия

}

}

}

}

Многие функции уровня пакета и глобальные функции являются собственными для каждой отдельно взятой среды выполнения Flash. Список доступных функций можно найти в документации корпорации Adobe по интересуемой среде выполнения Flash.

Пожалуй, наиболее используемой собственной глобальной функцией является функция trace ( ), имеющая следующий обобщенный вид:

trace (аргумент!, аргумент2… аргумент)

Функция trace ( ) представляет собой простейший инструмент для поиска ошибок в программе (то есть для отладки). Она позволяет выводить указанные аргументы либо в окно среды разработки, либо в файл журнала. Например, при выполнении программы в тестовом режиме в среде разработки Flash с помощью команды Control > Test Movie (Управление > Проверка фильма) результаты всех вызовов функции trace ( ) появятся в окне Output (Вывод). Подобным образом при выполнении программы в тестовом режиме в приложении Flex Builder с помощью команды Run > Debug (Выполнить > Отладка) результаты всех вызовов функции trace ( ) появятся в окне Console (Консоль). Информацию по конфигурированию отладочной версии приложения Flash Player для вывода аргументов функции trace ( ) в текстовый файл можно найти по адресу http://livedocs. macromedia. com/ flex/2/docs/00001531.html.

Вложенные функции

Когда описание функции размещается внутри метода или другой функции, создается вложенная функция, которая доступна для использования только внутри содержащего ее метода или функции. По существу, вложенная функция описывает многократно используемую подзадачу, полностью принадлежащую тому методу

или функции, в которых она определена. Следующий код демонстрирует базовый пример вложенной функции b ( ), описанной внутри метода экземпляра а ( ). Вложенная функция b ( ) может быть использована только внутри метода а ( ); за пределами метода а ( ) функция b ( ) недоступна.

// Описание метода а( ) public function а ( ) {

// Вызов вложенной функции Ь( )

Ь( );

// Описание вложенной функции Ь( ) function b ( ) { // Здесь должно размещаться тело функции

}

}

В предыдущем коде стоит обратить внимание на то, что вложенная функция может вызываться в любом месте содержащего ее метода, даже до описания этой функции. Обращение к переменной или функции до того, как эта переменная или функция будут описаны, называется опережающим обращением. Помимо этого стоит отметить, что для вложенных функций невозможно использовать модификаторы управления доступом (public, internal и т. д.).

Следующий код демонстрирует более реальный пример метода, содержащего вложенную функцию. Метод getRandomPoint ( ) возвращает объект типа Point, который представляет произвольную точку в заданном прямоугольнике. Чтобы получить произвольную точку, этот метод использует вложенную функцию getRandoml ntедег ( ) для вычисления случайных координат по осям X и Y. Обратите внимание, что в функции getRandomlnteger ( ) применяются собственные статические методы Math. random ( ) и Math. floor ( ). Первый метод возвращает случайное число с плавающей запятой, большее либо равное 0, но меньшее 1. Второй метод устраняет дробную часть числа с плавающей запятой. Дополнительную информацию по статическим методам класса Math можно найти в справочнике по языку ActionScript корпорации Adobe.

Руководство по actionscript. часть 1, стр. 098

Public function getRandomPoint (rectangle) { var randomX = getRandomlnteger(rectangle. left, rectangle. right); var randomY = getRandomlnteger(rectangle. top. rectangle. bottom);

return new Point(randomX. randomY);

function getRandomlnteger (min. max) { return min + Math. floor(Math. random( )*(max+l — min));

}

}

Функции уровня исходного файла

Если описание функции размещается на верхнем уровне исходного файла за пределами тела пакета, то будет создана функция, доступная только внутри данно-

го исходного файла. В следующем примере представлено содержимое исходного файла А. as, включающее описание пакета, описание класса и описание функции уровня исходного файла. Поскольку функция определена за пределами оператора блока пакета, она может быть использована в любом месте кода внутри файла А. as, однако вне этого файла данная функция будет недоступна.

package {

// Функцию f( ) можно использовать здесь class А {

// Функцию f( ) можно использовать здесь public function А ( ) { // Функцию f( ) можно использовать здесь

// Функцию f( ) можно использовать здесь

function f ( ) { }

В предыдущем коде обратите внимание на то, что описание функции f ( ) не содержит и не должно содержать никаких модификаторов управления доступом (publ i с, internal ит. д.).

rtp* 1 Модификаторы управления доступом не должны применяться при описании функций

м$ i« уровня исходного файла.

Функции уровня исходного файла иногда используются для определения дополнительных модулей, относящихся к одному классу (как, например, к классу А в предыдущем коде). Тем не менее, поскольку дополнительные модули для класса можно определять и с помощью закрытых статических методов, функции уровня исходного файла редко используются в реальных программах на языке ActionScript.

Доступ к описаниям из функции

Место размещения функции в программе влияет на возможность обращения к описаниям этой программы из данной функции (то есть к классам, переменным, методам, пространствам имен, интерфейсам и другим функциям). Подробное описание того, к чему можно и к чему нельзя обращаться из кода функций, можно найти в разд. «Область видимости функций» гл. 16.

Руководство по actionscript. часть 1, стр. 099

Обратите внимание, однако, что внутри замыкания функции ключевое слово this всегда ссылается на глобальный объект, независимо от места определения этой функции. Чтобы обратиться к текущему объекту внутри вложенной функции в методе экземпляра, присвойте ключевое слово this переменной, как показано в следующем коде:

public function m ( ) { var currentObject = this:

function f ( ) { // Здесь можно обращаться к переменной currentObject trace(currentObject): // Отображает объект, через который был // вызван метод т( )

}

}

Функции в качестве значений

В языке ActionScript любая функция представляется экземпляром класса Function. По существу, функция может быть присвоена переменной, передана в функцию или возвращена из нее точно так же, как и любое другое значение. Например, в следующем коде описывается функция а ( ), после чего она присваивается переменной Ь. Обратите внимание, что оператор круглых скобок ( ) опущен; в противном случае переменной b было бы просто присвоено возвращаемое значение функции а ( ).

function а ( ) { }

var b = а;

Как только функция будет присвоена переменной, ее можно вызывать через эту переменную с помощью стандартного оператора круглых скобок ( ). Например, в следующем коде функция а ( ) вызывается через переменную Ь:

Ь( );

Функции-значения обычно используются при создании динамических классов и объектов, которые рассматриваются в разд. «Динамическое добавление нового поведения в экземпляр» и «Использование объектов-прототипов для дополнения классов» гл. 15.

Синтаксис литералов функций

Экземпляры класса Function, как и многих предопределенных классов языка ActionScript, можно создавать с помощью синтаксиса литералов. Он практически ничем не отличается от синтаксиса стандартного объявления функций, за исключением отсутствующего имени функции. Вот его общий вид:

function (параметр1, параметр2… параметра) { }

Здесь параметр1, параметр2. . . параметра — это необязательный список параметров.

Чтобы воспользоваться функцией, описанной с помощью литерала функции, за пределами выражения, в котором встречается данный литерал, мы можем присвоить эту функцию переменной, как показано в следующем коде:

var некаяПеременная = function (параметр!, параметр2… параметра) {

После этого вызывать функцию можно через данную переменную, как показано

некаяПеременная (аргумент!, аргумент2… аргумента)

Например, в следующем коде для создания функции, которая возводит число в квадрат, используется литерал функции, а созданная функция присваивается переменной square:

var square = function (n) { return n * n;

Для вызова функции из предыдущего примера применяется следующий код:

// Возводит в квадрат число 5 и возвращает результат square(5)

Литералы функций иногда применяются совместно с собственной функцией flash, utils. set Interval ( ), которая имеет следующий вид:

setlnterval (Фуш/ияйли/^год. задержка)

Функция set Interval ( ) создает интервал, используемый для автоматического вызова указанной функции или метода (ФункцияИлиМетод) каждые задержка миллисекунд. Каждому создаваемому интервалу присваивается число, возвращаемое функцией setlnterval( )и называемое идентификатором интервала. Идентификатор интервала может быть присвоен переменной, что в дальнейшем позволит удалить соответствующий интервал вызовом функции clear Interval ( ), как показано в следующем примере кода:



Полезные ссылки
Случайные записи
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.21
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 124
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 030
  • 06.03.2011">Руководство по actionscript. часть 4, стр. 146
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.114
  • 27.02.2011">Руководство по actionscript. часть 6, стр. 026
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.31
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 066
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 029
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 139
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.12
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 067
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.54
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.53
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.7
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...