Опубликован: 23.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский физико-технический институт
Лекция 3:

Клипы и ролики. Специальные возможности языка

Старшинство областей видимости

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

  1. Если идентификатор находится внутри блока, относящегося к инструкции with , то в первую очередь поиск происходит среди полей объекта, указанного в with в круглых скобках. Если несколько инструкций with вложены друг в друга, то поиск начинается с объекта, относящегося к внутренней инструкции.
  2. Если идентификатор находится внутри тела функции, то просматриваются локальные переменные и аргументы функции. Если функция сгенерирована внутри другой функции, то далее просматриваются локальные переменные и аргументы внешней функции (точнее, соответствующего экземпляра ее вызова). О том, что такое экземпляр вызова и как осуществляется этот поиск, мы подробнее поговорим в пятой главе, рассказывающей о функциях.
  3. Затем просматриваются поля клипа, чей кадр (или функция реакции на сообщение) содержит рассматриваемый кусок кода.
  4. Наконец, просматриваются поля объекта _global . Поэтому еще раз повторим важное правило: если вы хотите, чтобы какие-то функции или объекты были доступны в любой точке кода, заведите их (то есть, поместите ссылки на них) в _global .

Возможные ошибки

При пользовании инструкцией with легко забыть, что поиск осуществляется среди уже имеющихся переменных, и попытка создать новую переменную "на ходу" окончится неудачей. Вот пример такого неправильного использования with :

obj = {};
with (obj){
   z = 20;
}
trace("obj.z = " + obj.z);
trace("_root.z = " + _root.z);

На выходе имеем:

obj.z =
_root.z = 20

В данном случае, поскольку код был помещен в кадре объекта _root , то и переменная z появилась в _root . А если бы этот код был вызван в произвольном месте из какой-нибудь функции, вам пришлось бы долго разыскивать переменную z (она появилась бы в том клипе, из кадра или обработчика событий которого был вызван код). Так что будьте внимательны.

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет