Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
as3_learning.pdf
Скачиваний:
43
Добавлен:
21.05.2015
Размер:
1.8 Mб
Скачать

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

81

Язык ActionScript и его синтаксис

Одним из недостатков использования цикла while вместо цикла for является то, что неопределенные циклы проще писать с помощью циклов while. Пример программного кода с циклом for не компилируется, если пропущено выражение, которое инкрементально увеличивает переменную обратного счетчика, но цикл while не компилируется, если пропущен этот шаг. Без выражения, инкрементально увеличивающего переменную i, цикл становится неопределенным циклом.

do..while

Цикл do..while является циклом while, в котором гарантируется, что блок кода будет выполнен хотя бы один раз, поскольку условие проверяется после выполнения блока программного кода. В следующем программном коде показан простой пример цикла do..while, создающего выходные данные даже в случае несоблюдения условия.

var i:int = 5; do

{

trace(i);

i++;

} while (i < 5); // output: 5

Функции

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

Функции всегда были очень важны в ActionScript. В ActionScript 1.0, например, ключевое слово class отсутствует, поэтому «классы» определялись функциями конструктора. Хотя ключевое слово class с тех пор и было добавлено к языку, четкое понимание функций по-прежнему важно, если требуется полностью использовать все преимущества, предлагаемые языком. Это, возможно, вызовет сложности у программистов, ожидающих, что функции ActionScript будут вести себя так же, как функции в языке C++ или Java. Хотя само определение основной функции и ее вызовов не должно представлять сложности для опытных программистов, некоторые более сложные возможности функций ActionScript требуют дополнительного объяснения.

Концепции основной функции

Вызов функций

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

trace("Use trace to help debug your script");

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

82

Язык ActionScript и его синтаксис

Если вызывается функция без параметров, необходимо использовать пустые парные скобки. Например, можно использовать метод Math.random(), который не получает параметров, чтобы создавать произвольные числа.

var randomNum:Number = Math.random();

Определение собственных функций

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

Инструкции Function

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

Имя функции

Заключенный в скобки список параметров, разделенных запятыми

Тело функции — это заключенный в фигурные скобки программный код ActionScript, который будет выполняться при вызове функции

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

function traceParameter(aParam:String)

{

trace(aParam);

}

traceParameter("hello"); // hello

Выражения Function

Можно другим способом объявить функцию, используя инструкцию присваивания с выражением function. Этот метод иногда называется литералом функции или анонимной функцией. Это более трудоемкий метод, который широко использовался в ранних версиях ActionScript.

Инструкция присваивания с выражением функции начинается с ключевого слова var, за которым идут следующие элементы.

Имя функции

Оператор двоеточие (:)

Класс Function для указания типа данных

Оператор присваивания (=)

Ключевое слово function

Заключенный в скобки список параметров, разделенных запятыми

Тело функции — это заключенный в фигурные скобки программный код ActionScript, который будет выполняться при вызове функции

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

83

Язык ActionScript и его синтаксис

Например, в следующем программном коде объявляется функция traceParameter, использующая выражение function.

var traceParameter:Function = function (aParam:String)

{

trace(aParam);

};

traceParameter("hello"); // hello

Обратите внимание, что в отличие от инструкции function имя функции не указывается. Другим важным отличием между выражениями function и инструкциями function является то, что выражение - это именно выражение, а не инструкция. Это означает, что выражение function не может использоваться отдельно подобно инструкции function. Выражение function может использоваться только в качестве части инструкции, обычно инструкции присваивания. В следующем примере показано выражение function, присвоенное элементу массива.

var traceArray:Array = new Array(); traceArray[0] = function (aParam:String)

{

trace(aParam);

};

traceArray[0]("hello");

Выбор между инструкцией и выражением

Стандартное правило предписывает использовать инструкцию function до тех пор, пока в силу особых обстоятельств не потребуется использовать выражение. Инструкции function менее трудоемки и обеспечивают более согласованную работу в строгом и стандартном режиме, чем выражения function.

Инструкции function проще читаются чем инструкции присваивания, содержащие выражения function. Инструкции function делают код более кратким; они вносят меньше путаницы, чем выражения function, для которых требуется использовать оба ключевых слова: var и function.

Операторы function обеспечивают более согласованное поведение в обоих режимах компилятора, поскольку для вызова метода, объявленного с помощью оператора function, можно использовать синтаксис с точкой как в строгом, так и в стандартном режимах. Это не обязательно так для методов, объявленных с помощью выражения function. Например, в следующем программном коде определяется класс с именем Example, содержащий два метода: methodExpression(), объявляемый с помощью выражения function, а также метод methodStatement(), объявляемый с помощью инструкции function. В строгом режиме нельзя использовать синтаксис с точкой для вызова метода methodExpression().

class Example

{

var methodExpression = function() {} function methodStatement() {}

}

var myEx:Example = new Example();

myEx.methodExpression(); // error in strict mode; okay in standard mode myEx.methodStatement(); // okay in strict and standard modes

Считается, что выражения function лучше подходят для программирования, в котором больше внимания уделяется поведению во время выполнения или динамическому поведению. Если предпочтительно использовать строгий режим, но также необходимо вызывать метод, объявленный с помощью выражения function, можно использовать одну из двух технологий. Во-первых, можно вызвать метод, используя квадратные скобки ([]) вместо оператора точки (.). Вызов следующего метода успешно выполняется как в строгом, так и в стандартном режимах.

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

84

Язык ActionScript и его синтаксис

myExample["methodLiteral"]();

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

В некоторых обстоятельствах выражения могут быть очень полезны. Одним из наиболее распространенных случаев применения выражений function являются функции, которые используются однократно и потом сбрасываются. Другим менее частым вариантом применения является присоединение функции к свойству прототипа. Дополнительные сведения см. в разделе «Объект прототипа».

Существует два тонких различия между инструкциями function и выражениями function, которые следует учитывать при выборе методики использования. Первое отличие состоит в том, что выражения function не существуют независимо как объекты в отношении управления памятью и освобождения ресурсов. Говоря другими словами, если выражение function присваивается другому объекту, такому как элемент массива или свойство объекта, создается только ссылка на это выражение function в программном коде. Если этот элемент массива или объект, к которому прикрепляется выражение function, выходит из области действия или, говоря другими словами, больше недоступен, доступ к этому выражению function прекращается. Если этот элемент массива или объект удаляются, память, использовавшаяся выражением function, становится доступной для освобождения ресурсов, и это значит, что данную память можно затребовать и повторно использовать для других целей.

В следующем примере показано, что в выражении function, как только свойство, к которому присвоено выражение, удаляется, функция перестает быть доступной. Класс Test является динамическим, что означает, что можно добавить свойство с именем functionExp, в котором содержится выражение функции. Функции functionExp() могут вызываться с помощью оператора точки, но как только свойство functionExp удаляется, функция перестает быть доступной.

dynamic class Test {}

var myTest:Test = new Test();

// function expression

myTest.functionExp = function () { trace("Function expression") }; myTest.functionExp(); // Function expression

delete myTest.functionExp; myTest.functionExp(); // error

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

dynamic class Test {}

var myTest:Test = new Test();

// function statement

function stateFunc() { trace("Function statement") } myTest.statement = stateFunc;

myTest.statement(); // Function statement delete myTest.statement;

delete stateFunc; // no effect stateFunc();// Function statement myTest.statement(); // error

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

85

Язык ActionScript и его синтаксис

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

statementTest(); // statementTest

function statementTest():void

{

trace("statementTest");

}

Выражения function недоступны до тех пор, пока они не определены, поэтому возникает ошибка при выполнении следующего программного кода.

expressionTest(); // run-time error

var expressionTest:Function = function ()

{

trace("expressionTest");

}

Возвращение значений из функций

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

function doubleNum(baseNum:int):int

{

return (baseNum * 2);

}

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

function doubleNum(baseNum:int):int { return (baseNum * 2);

trace("after return"); // This trace statement will not be executed.

}

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

function doubleNum(baseNum:int):int

{

trace("after return");

}

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

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

Последнее обновление 12.5.2011.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]