Переменные

Переменные позволяют сохранять значения, используемые в программе. Чтобы объявить переменную, необходимо использовать инструкцию var с именем переменной. В ActionScript 3.0 использование инструкции var требуется всегда. Например, в следующей строке ActionScript объявляется переменная с именем i :

var i;

Если пропустить оператор var при объявлении переменной, появляется ошибка компилятора в строгом режиме и ошибка при выполнении в стандартном режиме. Например, в следующей строке программного кода возникает ошибка, если переменная i ранее не была определена:

i; // error if i was not previously defined

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

var i:int;

Значение переменной можно задать, используя оператор присваивания ( = ). Например, в следующем коде объявляется переменная i и ей назначается значение 20.

var i:int; 
i = 20;

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

var i:int = 20;

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

var numArray:Array = ["zero", "one", "two"];

Можно создать экземпляр класса с помощью оператора new . В следующем примере создается экземпляр с именем CustomClass и выполняется привязка вновь созданного экземпляра класса переменной с именем customItem .

var customItem:CustomClass = new CustomClass();

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

var a:int, b:int, c:int;

Также можно назначить значения каждой из переменных в одной строке кода. Например, в следующем программном коде объявляются три переменные ( a , b и c ), и каждой из них назначается значение.

var a:int = 10, b:int = 20, c:int = 30;

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

Знакомство с областью действия переменной

Областью действия переменной является область программного кода, где данная переменная доступна для лексических ссылок. Переменная global объявляется для всех областей программного кода, а переменная local — только для какой-то его части. В ActionScript 3.0 переменным всегда назначается область действия функции или класса, в которой они объявлены. Глобальная переменная — это переменная, определяемая вне определения какой-либо функции или класса. Например, в следующем программном коде глобальная переменная strGlobal создается путем обновления ее вне какой-либо функции. В этом примере показано, что глобальная переменная доступна как вне, так и внутри определения функции.

var strGlobal:String = "Global"; 
function scopeTest() 
{ 
    trace(strGlobal); // Global 
} 
scopeTest(); 
trace(strGlobal); // Global

Локальная переменная объявляется путем объявления переменной внутри функции. Наименьшей областью кода, для которой можно определить локальную переменную, является определение функции. Локальная переменная, объявленная внутри функции, существует только в этой функции. Например, если объявляется переменная с именем str2 в функции localScope() , то эта переменная не будет доступна вне данной функции.

function localScope() 
{ 
    var strLocal:String = "local"; 
} 
localScope(); 
trace(strLocal); // error because strLocal is not defined globally

Если используемое для локальной переменной имя уже объявлено для глобальной переменной, локальное определение скрывает (или затеняет) глобальное определение, пока локальная переменная находится в области действия. При этом глобальная переменная по-прежнему существует вне этой функции. Например, в следующем программном коде создается глобальная строковая переменная с именем str1 , а затем создается локальная переменная с тем же именем в функции scopeTest() . Инструкция trace в функции выводит локальное значение этой переменной, а инструкция trace вне функции выводит глобальное значение переменной.

var str1:String = "Global"; 
function scopeTest () 
{ 
    var str1:String = "Local"; 
    trace(str1); // Local 
} 
scopeTest(); 
trace(str1); // Global

Переменные ActionScript в отличие от переменных в C++ и Java не имеют области действия уровня блока. Блоком программного кода является группа операторов между открывающейся фигурной скобкой ( { ) и закрывающейся фигурной скобкой ( } ). В некоторых языках программирования, таких как C++ и Java, переменные, объявленные в блоке программного кода, недоступны вне этого блока кода. Это ограничение области действия называется областью действия уровня блока и не существует в ActionScript. Если переменная объявляется внутри блока программного кода, эта переменная доступна не только в этом блоке кода, но также во всех других частях функции, которой принадлежит этот блок кода. Например, следующая функция содержит переменные, которые определены в различных областях действия уровня блока. Все переменные доступны во всех частях функции.

function blockTest (testArray:Array) 
{ 
    var numElements:int = testArray.length; 
    if (numElements > 0) 
    { 
        var elemStr:String = "Element #"; 
        for (var i:int = 0; i < numElements; i++) 
        { 
            var valueStr:String = i + ": " + testArray[i]; 
            trace(elemStr + valueStr); 
        } 
        trace(elemStr, valueStr, i); // all still defined 
    } 
    trace(elemStr, valueStr, i); // all defined if numElements > 0 
} 
 
blockTest(["Earth", "Moon", "Sun"]);

Интересным следствием отсутствия области действия уровня блока является возможность считывать и записывать переменные, которые еще не были объявлены, при условии, что они будут объявлены до конца функции. Это возможно благодаря технологии, называемой подъем , которая подразумевает перемещение всех объявлений переменных в верхнюю часть функции. Например, следующий программный код компилируется несмотря на то, что исходная функция trace() для переменной num появляется до того, как объявлена переменная num .

trace(num); // NaN 
var num:Number = 10; 
trace(num); // 10

Однако компилятор не будет выполнять подъем каких-либо инструкций присваивания. Это объясняет, почему выполнение исходной функции trace() для переменной num в результате дает NaN (нечисловое значение), которое является значением по умолчанию для переменных с типом данных Number. Это означает, что можно назначать значения для переменных даже до того, как они будут объявлены, как показано в следующем примере.

num = 5; 
trace(num); // 5 
var num:Number = 10; 
trace(num); // 10

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

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

Тип данных

Значение по умолчанию

Boolean

false

int

0

Число

NaN

Объект

null

String

null

uint

0

Не объявлено (эквивалентно аннотации типа * )

undefined

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

null

Для переменных с типом Number значением по умолчанию является NaN (нечисловое значение), являющееся специальным значением, определенным стандартом IEEE-754 для передачи значений, не являющихся числами.

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

Для типов данных, отличных от Boolean, Number, int и uint, значением по умолчанию для любой неинициализированной переменной является null . Это применимо ко всем классам, определяемым языком ActionScript 3.0, а также к любым создаваемым классам.

Неопределенное значение null не является действительным значением для переменных с типом Boolean, Number, int или uint. Если выполняется попытка назначить значение null такой переменной, это значение преобразуется в значение по умолчанию для этого типа данных. Переменным с типом Object можно назначать значение null . При попытке назначить значение undefined переменной с типом Object, значение преобразуется в null .

Для переменных с типом Number существует специальная функция с названием isNaN() , которая возвращает логическое значение true , если переменная не число, и false в ином случае.