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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

90

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

function traceArgArray(... args):void

{

for (var i:uint = 0; i < args.length; i++)

{

trace(args[i]);

}

}

traceArgArray(1, 2, 3);

//output:

//1

//2

//3

Параметр ... (rest) также может использоваться с другими параметрами с условием, что он будет последним параметром в списке. В следующем примере функция traceArgArray() изменяется таким образом, что ее первый параметр, x, становится типом int, а второй — использует параметр ... (rest). При выводе первое значение пропускается, поскольку первый параметр больше не является частью массива, созданного параметром ... (rest).

function traceArgArray(x: int, ... args)

{

for (var i:uint = 0; i < args.length; i++)

{

trace(args[i]);

}

}

traceArgArray(1, 2, 3);

//output:

//2

//3

Функции в качестве объектов

В ActionScript 3.0 функции являются объектами. При создании функции создается объект, который не только может передаваться как параметр другой функции, но также имеет свойства и методы, присоединенные к нему.

Функции передаются как аргументы другим функциям в виде ссылок, а не значений. Если функция передается как аргумент, используется только ее идентификатор, но не оператор скобки, применяемый для вызова метода. Например, в следующем программном коде функция с именем clickListener() передается как аргумент методу addEventListener().

addEventListener(MouseEvent.CLICK, clickListener);

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

91

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

Хотя это может показаться странным для программистов, которые только начинают изучать ActionScript, как и любой другой объект, функции могут иметь свойства и методы. Действительно, каждая функция обладает доступным только для чтения свойством с именем length, в котором хранится число параметров, определенное для функции. Это свойство отличается от свойства arguments.length, в котором сообщалось о числе аргументов, переданных функции. Вспомним, что в ActionScript число аргументов, переданных функции, может превышать число параметров, заданных в определении этой функции. В следующем примере, который компилируется только в стандартном режиме, поскольку для строгого режима требуется точное соответствие числа переданных аргументов и параметров в определении, показано различие между этими двумя свойствами.

// Compiles only in standard mode function traceLength(x:uint, y:uint):void

{

trace("arguments received: " + arguments.length); trace("arguments expected: " + traceLength.length);

}

traceLength(3, 5, 7, 11); /* output:

arguments received: 4 arguments expected: 2 */

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

// Compiles only in standard mode

var someFunction:Function = function ():void

{

someFunction.counter++;

}

someFunction.counter = 0;

someFunction();

someFunction(); trace(someFunction.counter); // 2

Область действия функции

Область действия функции определяет не только, где в программе может вызываться функция, но также определения, которые доступны этой функции. Те же правила области действия, которые применимы к идентификаторам переменных, применяются и к идентификаторам функций. Функция, объявленная в глобальной области действия, доступна в любом месте программного кода. Например, ActionScript 3.0 содержит глобальные функции, такие как isNaN() и parseInt(), которые доступны в любом месте программного кода. Вложенная — это функция, объявленная внутри другой функции, которая может использоваться в любом месте функции, внутри которой она объявлена.

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

92

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

Цепочка области действия

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

Закрытия функций

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

Например, в следующем программном коде создаются две функции: foo(), которая возвращает вложенную функцию с именем rectArea(), рассчитывающую площадь прямоугольника, и функцию bar(), вызывающую foo() и сохраняющую возвращаемое закрытие функции в переменной с именем myProduct. Несмотря на то, что функция bar() определяет свою собственную локальную переменную x (со значением 2), если вызывается закрытие функции myProduct(), она сохраняет переменную x (со значением 40), определенную в функции foo(). Функция bar(), таким образом, возвращает значение 160 вместо 8.

function foo():Function

{

var x:int = 40;

function rectArea(y:int):int // function closure defined

{

return x * y

}

return rectArea;

}

function bar():void

{

var x:int = 2; var y:int = 4;

var myProduct:Function = foo(); trace(myProduct(4)); // function closure called

}

bar(); // 160

Методы ведут себя сходным образом, они также сохраняют информацию о лексической среде, в которой они были созданы. Эта особенность наиболее заметна, если метод извлекается из своего экземпляра, создавая связанный метод. Главное отличие между закрытием функции и связанным методом состоит в том, что значение ключевого слова this в связанном методе всегда ссылается на экземпляр, к которому он был первоначально прикреплен, в то время как в закрытии функции значение ключевого слова this можно изменять.

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

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