var x = 12, y;
Здесь введено две переменных с именами x и y,
в переменную x записано значение 12,
а переменная y не определена, то есть команда
трассировки
trace ( y );
выдаст результат undefined (значение не определено).
Такой же результат выдает и команда
trace ( z );
потому что переменная z вообще неизвестна. Для того, чтобы
отличить существующую переменную от неизвестной,
можно записать в нее специальное нулевое значение null:
var y = null;
Если тип переменной явно не указан, она может принимать любые значения. Например:
var x = 1; // число x = "Ку-ку!"; // строка x = false; // логическое значение
Однако при объявлении лучше явно указывать тип переменной. Это позволяет обнаруживать многие ошибки еще до выполнения программы. Существует три простых типа:
var x:Number = 0, y:String = "qq", b:Boolean = false;В переменные типа String можно записывать символьные строки, заключенные в кавычки или одиночные апострофы:
var s1:String = "qq1", s2:String = 'qq2';Логические переменные принимают только два значения: true (истина) и false (ложь):
var b:Boоlean = false; b = true; b = (a < 2);В последнем случае значение переменной b будет равно true, если условие справа от знака равенства верно.
Если в переменную попытаться записать значение неверного типа, вы получите сообщение об ошибке сразу при трансляции программы (то есть, при переводе ее в машинные коды), а не во время выполнения. Например, такой код вызывает ошибку:
var x:Number = 1; x = "Ку-ку!";
_global.x = 12;
Обратите внимание, что слово var здесь использовать не нужно,
такие переменные рассматриваются как свойства объекта
_global. К переменной x, которая объявлена
выше, можно обращаться из любой функции и из кода любого клипа
просто по имени.
Если в области видимости есть несколько переменных с одним и тем же именем, сначала ищется локальная переменная, затем переменная текущего клипа, и только потом глобальная переменная.
Переменные других клипов «не видны», для обращения к ним нужно указывать явно клип-родитель:
mc.x = 1; _root.x = 12; _parent.x = 123;
a = 4*(c + 2) + 3 / (r - 4*w) + d % 3;Знак * обозначает умножение, знак / деление, а % взятие остатка от деления.
В выражении арифметические операции выполняются в следующем порядке:
Символьные строки можно «сцеплять» с помощью оператора +:
no = 20; s = "Вася " + "пошёл гулять."; qq = "Объект" + no;Если в выражении участвуют разнотипные данные, происходит автоматическое преобразование к одному типу. Так в последней строке в переменную qq записывается строка Объект20.
Очень часто в программах используют операторы ++ (инкремент, увеличение переменной на 1, и -- (декремент, уменьшение переменной на 1). Операторы
i ++; k --;означают то же самое, что
i = i + 1; k = k - 1;Существует также сокращенная запись арифметических операций:
a += 20; b -= c - d; c *= a + b; d /= 2*c; f %= 12;Этот код можно заменить на такие операторы в «нормальной» форме:
a = a + 20; b = b - (c - d); c = c * (a + b); d = d / (2 * c); f = f % 12
var car = new Object(); car.v = 10; car.year = 1998;В среде Flash можно использовать объектно-ориентированное программирование, то есть создавать свои классы объектов, наделять их свойствами и методами (см. Тему 13).
Главная особенность объектов это так называемая ссылочная адресация. То есть, при объявлении
var obj = new Object();переменная obj хранит не сам объект, а только его адрес (ссылку на объект). Поэтому оператор присваивания
obj2 = obj;не создает в памяти новый объект, который является копией объекта obj, а просто копирует адрес первого объекта в переменную obj2. После этого obj и obj2 указывают на один объект. Если мы хотим действительно построить копию объекта, адрес которого хранится в obj, можно сделать так:
var obj2 = new Object(); for ( prop in obj ) obj2[prop] = obj[prop];Здесь в цикле перебираются все свойства первого объекта и копируются во второй. Переменная prop (символьная строка) это название очередного свойства. Запись obj[prop] означает «свойство объекта obj, название которого хранится в prop».
Нумерация элементов массива с нуля непривычна для обычных людей, но широко используется в программировании (языки Си, JavaScript, Java, ActionScript). |
Массив из трех элементов можно объявить и заполнить так:
A = new Array(3); A[0] = 12; A[1] = 4.56; A[2] = "Ку-ку!";или так:
A = new Array (12, 4.56, "Ку-ку!");или так:
A = [12, 4.56, "Ку-ку!"];
A = [1, 2, 3]; B = A; B[1] = 99; trace(A);Здесь создается массив A, затем он копируется в массив B. Потом изменяется B[1] и массив A выводится в окно Output. Вроде бы массив A не должен измениться, однако мы увидим в окне Output строчку:
1,99,3Почему же изменился массив A? Дело в том, что оператор B=A НЕ создает новый массив, а просто копирует в B адрес массива A, то есть A и B обращаются к одной области памяти. Поэтому, изменив B, мы изменили и A. Чтобы действительно создать копию массива, нужно заменить оператор B=A на код
B = new Array(); for(i=0; i<A.length; i++) B[i] = A[i];Здесь используется встроенное свойство length объекта Array длина массива.
A = new Array(); A[0] = [1, 2, 3]; A[1] = [4, "Вася"]; A[2] = [true, "qq", 4];В таком (двухмерном) массиве каждый элемент имеет два индекса. Например, A[1][0] имеет значение 4, а A[2][1] это символьная строка qq.
C = A.concat ( B, 12 );
в массиве C записаны все элементы массива A,
затем все элементы массива B, а затем число 12;
A.unshift ( 3, 4, "qq" );и в конец массива
A.push ( 3, 4, "qq" );
x = A.shift();
и с конца массива
x = A.pop();
удаленный элемент записывается в переменную x;
A.reverse();
B = A.slice ( n1, n2 );
здесь в массив B копируются все элементы массива
A с номерами от n1 до n2 включительно;
A.sort();
По умолчанию элементы массива сортируются по возрастанию в алфавитном
порядке; если надо сортировать числа, используется
форма
A.sort ( Array.NUMERIC );Для сортировки по убыванию нужно указать еще параметр Array.DESCENDING:
A.sort ( Array.NUMERIC + Array.DESCENDING );Если нужна нестандартная сортировка, в качестве параметра указывается ссылка на функцию, которая принимает два параметра (элемента массива) и возвращает
A = [12, 328, 731]; A.sort ( cmpFun ); function cmpFun(a, b) { return (a%10) - (b%10); } trace ( A );Массив будет отсортирован по возрастанию последней цифры:
731,12,328потому что a%10 это остаток от деления числа a на 10 или его последняя цифра.
if ( условие ) { ... // блок if } else { ... // блок else }Если условие истинно, выполняется блок if, а если ложно блок else. В каждом из них можно размещать любые операторы. в том числе и другие условные операторы.
Второй блок (начиная со слова else) может отсутствовать. При этом если условие не выполняется, никаких действий не будет. Такая форма называется неполной формой условного оператора:
if ( условие ) { ... // блок if }Если внутри фигурных скобок стоит всего один оператор, скобки можно не ставить.
Простейшие условия это отношения
if ( x < 0 ) { trace ( "x отрицательный" ); } else { if ( x == 0 ) { trace ( "x равен 0" ); } else { trace ( "x положительный" ); } }Здесь используется вложенный условный оператор (один внутри другого).
Сложные условия образуются из простых (отношений) с помощью логических операций:
a = 1; b = 2; c = 3; if ( a < b && a < c ) trace ( "a - наименьшее" ); if ( b > a || b > c ) trace ( "b - не наименьшее" );Оба условных оператора здесь сработают и в окно Output будут выведены оба сообщения.
for ( начальные значения; условие; изменения ) { ... // тело цикла }В заголовке цикла три части, разделенные точками с запятой. Операторы в первой части выполняются один раз при входе в цикл.
В цикле выполняются все операторы, расположенные внутри фигурных скобок (в теле цикла). Если там всего один оператор, скобки можно не ставить. Цикл работает до тех пор, пока условие в заголовке цикла не станет ложным.
После каждого шага цикла выполняются операторы, записанные в третьей части (изменения).
В цикле
for ( i=0; i<10; i++ ) trace ( i );в окно Output выводятся в столбик числа от 0 до 9 включительно. Действительно:
Цикл с переменной часто используют для обработки массивов, при этом i обозначает номер элемента:
A = [1, 2, 3]; for ( i=0; i<A.length; i++ ) A[i] *= 2;Этот цикл умножает все элементы массива A на 2.
while ( условие ) {
...
}
Цикл заканчивается, когда условие становится ложным.
Например:
i = 0; while ( i < 10 ) { trace ( i ); i ++; }Этот цикл, так же, как и в предыдущем примере, выводит числа от 0 до 9.
Если условие всегда истинно, программа зацикливается (будет работать бесконечно долго). Например, часто забывают изменять переменную в теле цикла:
i = 0; while ( i < 10 ) { trace ( i ); // зацикливание!!! }Проверка условия стоит в начале цикла (цикл с предусловием), поэтому он ни разу не выполняется, если условие неверно при входе в цикл.
Если в теле цикла стоит один оператор, фигурные скобки можно не ставить.
Цикл с постусловием отличается тем, что проверка условия выполняется после очередного шага:
do { ... } while ( условие );Такой цикл всегда выполняется хотя бы один раз.
for ( var переменная in объект ) { ... }В этом цикле переменная «проходит» все свойства объекта, ее значение на каждом шаге название очередного свойства. Например, цикл:
var obj = new Object(); obj.x = 10; obj.y = 20; for ( var prop in obj ) { trace ( prop + " = " + obj[prop]); }выведет в окно Output названия свойств, x и y, и их значения:
x = 10 y = 20
for ( i=0; i<10; i++ ) { trace ( i ); if ( i >= 3 ) break; }выполнится только 4 раза.
Другой цикл
for ( i=0; i<10; i++ ) { if ( i >= 3 ) continue; trace ( i ); }выполнится 10 раз, но в окно Output будут выведены только числа 0, 1 и 2.
Функции объявляются с помощью слова function:
function qq() {
...
}
Имя этой функции qq, при ее вызове
qq(); выполняются все команды внутри фигурных скобок.
Многоточие здесь и далее означает любой код на ActionScript.
Функция может принимать параметры или аргументы дополнительные данные, которые влияют на ее работу. Параметры перечисляются через запятую в скобках:
function qq ( x ) { ... } function ww ( x:Number, s:String ) { ... }Функция qq принимает один параметр, его тип может быть любой. Функция ww принимает два параметра, причем их типы жестко заданы: первый число, второй символьная строка.
Функция может возвращать результат (число, строку, логическое значение и т.д.) с помощью оператора return. Например:
function Sum ( x, y ) { var s = x + y; return s; // или return x + y; }Чтобы использовать это значение, надо записать его в переменную:
w = Sum ( 2, 3 );
trace ( w );
function qq () { ... }
с другой временной шкалы (из обработчика другого клипа) она
вызывается как _root.qq().
Ту же функцию можно объявить по-другому:
qq = function() { ... }
При этом фактически создается переменная типа «ссылка на функцию»
и в нее записывается адрес кода. Разница (в сравнении с первым способом)
состоит в том, что в переменную qq
можно потом записать адрес другой функции:
qq = function () { trace(1); } qq(); qq = newFunc; qq(); function newFunc () { trace ( 2 ); }Если в первый раз при выполнении оператора qq() вызывается первая (безымянная) функция, то второй раз функция newFunc. Заметим, что после присваивания qq=newFunc к первой функции уже никак не обратиться ее адрес потерян.
Глобальные функции объявляются с помощью слова _global:
_global.qq = function ( x ) { ... }Эту функцию можно вызывать просто как qq() из любого места программы, в том числе из обработчиков событий клипов.
Локальные функции объявляются внутри другой функции и известны только там. В примере
trace(b); a(); function a() { function b() {} trace(b); }функция b локальная для функции a, поэтому первый вызов trace(b) даст результат undefined (не определено), а второй (изнутри функции a) [type Function], то есть, найдена функция с таким именем.
Пусть на текущем монтажном столе есть кнопка с именем btn (имя кнопки задается в левой части на панели Properties). Разберем такой код:
btn.onRelease = function () { trace("q"); btn.onRelease = second; } function second() { trace("qq"); btn.onRelease = null; }Вначале обработчик события кнопки это безымянная функция, которая выводит на экран букву q и, кроме этого, меняет обработчик события на адрес функции second.
При втором щелчке вызывается функция second, которая выводит две буквы q и уничтожает обработчик, записывая в него null. На последующие щелчки кнопка не будет реагировать.
Всякая всячина |
© 2007 К. Поляков