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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

86

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

function getNameAndVersion():String

{

function getVersion():String

{

return "10";

}

function getProductName():String

{

return "Flash Player";

}

return (getProductName() + " " + getVersion());

}

trace(getNameAndVersion()); // Flash Player 10

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

Параметры функций

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

Передача аргументов значением и ссылкой

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

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

В ActionScript 3.0 все аргументы передаются ссылками, поскольку все значения хранятся как объекты. Однако объекты, принадлежащие примитивным типам данных, к которым относятся Boolean, Number, int, uint, и String, имеют специальные операторы, которые позволяют воспроизвести поведение объектов при передаче аргументов значениями. Например, в следующем программном коде создается функция с именем passPrimitives(), определяющая два параметра с именем xParam и yParam, оба с типом int. Эти параметры сходны с локальными переменными, объявленными в теле функции passPrimitives(). Если функция вызывается с аргументами xValue и yValue, параметры xParam и yParam инициализируются со ссылками на объекты int, представленные значениями xValue и yValue. Поскольку эти аргументы имеют примитивные типы, они ведут себя так, как если бы передавались значениями. Хотя параметры xParam и yParam изначально содержат только ссылки на xValue и yValue объекты, любые изменения переменных в теле функции создают новые копии значений в памяти.

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

87

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

function passPrimitives(xParam:int, yParam:int):void

{

xParam++;

yParam++; trace(xParam, yParam);

}

var xValue:int = 10; var yValue:int = 15;

trace(xValue, yValue);// 10 15 passPrimitives(xValue, yValue); // 11 16 trace(xValue, yValue);// 10 15

В функции passPrimitives() значения xParam и yParam являются инкрементальными, но это не влияет на значения xValue и yValue, как показано в последней инструкции trace. И это действительно будет так, даже если параметры будут названы так же, как переменные, xValue и yValue, поскольку имена xValue и yValue внутри функции будут указывать на новое местоположение в памяти, которое существует отдельно от переменных с таким же именем вне функции.

Все другие объекты, т.е объекты, которые не принадлежат примитивным типам данных, всегда передаются ссылками, что дает возможность изменять значение исходной переменной. Например, в следующем программном коде создается объект с именем objVar и двумя свойствами: x и y. Этот объект передается как аргумент функции passByRef(). Поскольку тип данных объекта не примитивный, он не только предается ссылкой, но также хранится как ссылка. Это означает, что изменения, вносимые в параметры в функции, влияют на свойства объекта вне функции.

function passByRef(objParam:Object):void

{

objParam.x++;

objParam.y++; trace(objParam.x, objParam.y);

}

var objVar:Object = {x:10, y:15}; trace(objVar.x, objVar.y); // 10 15 passByRef(objVar); // 11 16 trace(objVar.x, objVar.y); // 11 16

Параметр objParam ссылается на тот же объект, что и глобальная переменная objVar. Как можно видеть из инструкции trace в приведенном примере, изменения свойств x и y в объекте objParam отражаются в объекте objVar.

Значения параметров по умолчанию

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

обязательным параметром.

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

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

88

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

function defaultValues(x:int, y:int = 3, z:int = 5):void

{

trace(x, y, z);

}

defaultValues(1); // 1 3 5

Объект arguments

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

Объект arguments является массивом, содержащим все параметры, переданные функции.

Свойство arguments.length сообщает о числе параметров, переданных функции.

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

Примечание. Объект arguments недоступен, если какой-либо параметр имеет имя arguments, а также в тех случаях, когда используется параметр ... (rest).

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

function traceArgArray(x:int):void

{

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

{

trace(arguments[i]);

}

}

traceArgArray(1, 2, 3);

//output:

//1

//2

//3

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

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

89

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

var factorial:Function = function (x:uint)

{

if(x == 0)

{

return 1;

}

else

{

return (x * arguments.callee(x - 1));

}

}

trace(factorial(5)); // 120

Если при объявлении функции используется параметр ... (rest), объект arguments недоступен. Вместо него необходимо будет обращаться к параметрам, используя объявленные для них имена.

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

function traceArgArray(x:int, arguments:int):void

{

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

{

trace(arguments[i]);

}

}

traceArgArray(1, 2, 3);

// no output

Объект arguments в предыдущих версиях ActionScript также содержал свойство с именем caller, которое является ссылкой на функцию, вызывающую текущую функцию. Свойство caller отсутствует в ActionScript 3.0, но если нужна ссылка на вызывающую функцию, можно изменить ее так, чтобы она передавала дополнительный параметр, являющейся ссылкой на нее саму.

Параметр ... (rest)

В ActionScript 3.0 появилось новая возможность объявления параметров, называемая параметр ... (rest). Этот параметр позволяет указать параметр массива, который принимает любое количество разделенных запятыми аргументов. Этот параметр может иметь любое имя при условии, что оно не является зарезервированным словом. Это объявление параметра должно быть последним указываемым параметром. Использование этого параметра делает объект arguments недоступным. Хотя параметр ... (rest) дает ту же функциональность, что массив arguments и свойство arguments.length, он не обеспечивает возможностей свойства arguments.callee. Необходимо убедиться, что использование возможностей свойства arguments.callee действительно не требуется, прежде чем использовать параметр ... (rest).

В следующем примере функция traceArgArray() перезаписывается с использованием параметра ... (rest) вместо объекта arguments.

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

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