Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2869 / 253 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 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 (она появилась бы в том клипе, из кадра или обработчика событий которого был вызван код). Так что будьте внимательны.