Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008 |
Клипы и ролики. Специальные возможности языка
Старшинство областей видимости
К настоящему моменту мы вкратце познакомились уже со всеми понятиями, которые имеют отношение к областям видимости переменных. Итак, встретив некоторый идентификатор, Флэш ищет соответствующий ему объект таким образом:
- Если идентификатор находится внутри блока, относящегося к инструкции with , то в первую очередь поиск происходит среди полей объекта, указанного в with в круглых скобках. Если несколько инструкций with вложены друг в друга, то поиск начинается с объекта, относящегося к внутренней инструкции.
- Если идентификатор находится внутри тела функции, то просматриваются локальные переменные и аргументы функции. Если функция сгенерирована внутри другой функции, то далее просматриваются локальные переменные и аргументы внешней функции (точнее, соответствующего экземпляра ее вызова). О том, что такое экземпляр вызова и как осуществляется этот поиск, мы подробнее поговорим в пятой главе, рассказывающей о функциях.
- Затем просматриваются поля клипа, чей кадр (или функция реакции на сообщение) содержит рассматриваемый кусок кода.
- Наконец, просматриваются поля объекта _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 (она появилась бы в том клипе, из кадра или обработчика событий которого был вызван код). Так что будьте внимательны.