Локальные переменные функций

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

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

function func():Void {
per = this; // При вызове будет создана переменная per с таким же
// расположением, как и func()
trace(per); // Выводит: undefined (код в теле функции будет выполнен
// только при ее вызове) func ();trace(per); // Выводит: _level0 (func() расположена на основной временной
// диаграмме)

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


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

function func():Void {
var per:Number =0; // При вызове будет создана локальная переменная
// объекта активации функции
}
func();
trace(per); // Выводит: undefined (переменная не была сохранена на основной
// временной диаграмме)

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

var per:Number = 0;
function func():Void {
var per:MovieClip = this;
trace(per); // Выводит: _level0 (значение локальной
// переменной в приоритете)
}
func();
trace(per); // Выводит: 0 (существование одноименной локальной
// переменной не влияет на per)

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

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


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

var i:String="Привет";
for(var i=0; i<=10, i++) { // Итератор совпадает по имени с существующей
// переменной
var new var = i; // Пытаемся создать, по аналогии с функциями,
// локальную переменную блока
};
trace(new var); // Выводит: 10 (локальную переменную задать в блоке цикла
// нельзя)
trace(i); // Выводит: 11 (итератор не обладает локальной
// видимостью — переменная i была переопределена)

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


Именно поэтому хранящиеся в нем локальные переменные обладают приоритетом над переменными основного кода.

Подводя итог всему тому, что мы говорили о создании переменных в ActionScript, можно сделать следующий вывод. Всякий раз, когда вы объявляете новую переменную, желательно использовать слово var. Если же переменная должна быть определена в результате вызова некоторой функции, то лучше задать ее явно в начале сценария, присвоив значение null, а функции оставить только задачу присвоения ей нужного значения. Используя описанный подход, вы минимизируете вероятность возникновения ошибки из-за конфликта переменных.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Есть ли переменные в ActionScript?
Особенности операции присваивания
Особенности типизации переменных
Создание переменных
Удаление переменных

Вернуться в раздел: Action Script / 3. Переменные