Руководство по actionscript. часть 2, стр. 129
Это демонстрирует следующий код:
package {
public class SomeClass extends SomeParentClass { public function instanceMeth ( ) { // Все методы и переменные экземпляра текущего объекта (то есть this) // доступны в методе instanceMeth( ) (с учетом ограничений, налагаемых // используемыми модификаторами управления доступом). // Определенные здесь локальные переменные, вложенные функции // и пространства имен доступны в методе instanceMeth( )
}
}
}
Область видимости функции
Код, добавленный в тело функции, находится в области видимости данной функции. Конкретный список определений, доступных коду, находящемуся в области видимости функции, зависит от местоположения этой функции в программе.
Код в функции, которая определена на уровне пакета или за пределами всех пакетов, может обращаться к следующим определениям:
? ко всем определениям, доступным коду в глобальной области видимости;
? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.
Код в функции, которая определена внутри статического метода, может обращаться к таким определениям:
? ко всем определениям, доступным коду в глобальной области видимости;
? ко всем определениям, доступным коду в области видимости данного статического метода;
? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.
Руководство по actionscript. часть 2, стр. 130
Код в функции, определенной внутри метода экземпляра, может обращаться к следующим определениям:
? ко всем определениям, доступным коду в глобальной области видимости;
? ко всем определениям, доступным коду в области видимости данного метода экземпляра;
? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.
Код в функции, которая определена внутри другой функции, может обращаться к таким определениям:
? ко всем определениям, доступным коду в глобальной области видимости;
? ко всем определениям, доступным коду в области видимости внешней функции;
? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.
Обзор областей видимости
Приведенный далее код демонстрирует все возможные области видимости языка ActionScript:
package {
// Размещенный здесь код находится в глобальной области видимости
public class SomeClass { // Этот код находится в области видимости класса SomeClass
public static function staticMeth ( ):void { // Размещенный здесь код находится в области видимости метода // staticMeth
}
public function instanceMeth ( ):void { // Этот код находится в области видимости метода instanceMeth
function nestedFunc ( ):void { // Размещенный здесь код находится в области видимости функции // nestedFunc
}
}
}
}
// Этот код находится в глобальной области видимости
Детали реализации
Для осуществления хранения информации об определениях в цепочке областей видимости среда Flash использует список объектов. Информацию об определениях для каждой области видимости хранят следующие объекты.
Руководство по actionscript. часть 2, стр. 131
Глобальная область видимости — глобальный объект (объект, автоматически создаваемый средой выполнения Flash для хранения глобальных определений).
Область видимости класса — объект Class данного класса (и объекты Class его предков).
Область видимости статического метода — объект Class данного класса (и объекты Class его предков).
Область видимости метода экземпляра — текущий объект (this) и объект активации (объект активации — это объект, создаваемый средой выполнения Flash и хранящийся в ней, который включает локальные переменные и параметры функции или метода).
Область видимости функции — объект активации.
Когда среда выполнения Flash встречает в программе выражение-идентификатор, она выполняет поиск этого идентификатора среди объектов в цепочке областей видимости. Например, рассмотрим следующий код:
package { public class SomeClass { public function instanceMeth ( ):void { function nestedFunc ( ):void { trace(a):
}
}
}
}
var a.-int = 15;
Когда среда Flash встречает идентификатор а, она выполняет поиск его значения в объекте активации функции nestedFunc ( ). Однако в функции nestedFunc ( ) не определено никаких локальных переменных или параметров с именем а, поэтому далее среда Flash продолжает поиск идентификатора а в текущем объекте (то есть в объекте, через который был вызван метод instanceMeth ( ) ). Но класс SomeClass не определяет и не наследует метод или переменную экземпляра
с именем а, поэтому после этого Flash продолжает поиск идентификатора а в классе объекта SomeClass. В классе SomeClass отсутствует определение статического метода или статической переменной с именем а, поэтому далее среда выполнения Flash продолжает поиск идентификатора а в объекте суперкласса класса SomeClass, которым является класс Ob j ect. Однако в классе Ob j ect отсутствует определение статического метода или статической переменной с именем а, поэтому после этого среда Flash продолжает поиск идентификатора а в глобальном объекте. В нем Flash находит идентификатор а и определяет, что значением этого идентификатора является 15. Получив значение идентификатора а, среда выполнения выводит число 15 в процессе отладки. Довольно много действий, чтобы найти маленькую а!
Вот объекты, среди которых среда выполнения Flash пыталась найти идентификатор а, перечисленные в порядке поиска:
? объект активации функции nestedFunc ( );
? объект, через который был вызван метод instanceMeth ( );
? объект класса SomeClass;
? объект класса Object;
? глобальный объект.
Руководство по actionscript. часть 2, стр. 132
Если бы идентификатор а не был найден в глобальном объекте, среда выполнения Flash сообщила бы об ошибке обращения.
Л’т -
I Переменные, объявленные за пределами описания пакета, доступны только внутри м$ исходного файла, содержащего эти переменные.
1 9$-
Теперь, когда все известно про цепочку областей видимости, завершим эту главу, рассмотрев единственный инструмент языка ActionScript, который позволяет непосредственно управлять цепочкой областей видимости, — оператор with.
Расширение цепочки областей видимости с помощью оператора with
Оператор with предоставляет сокращенный способ обращения к переменным и методам объекта, который исключает необходимость повторно указывать имя объекта. Этот оператор имеет следующий обобщенный вид:
with (объект) { вложенныеИнструкции
}
Когда обращение к идентификатору происходит внутри блока оператора with, на наличие указанного имени проверяется объект объект до того, как будет проверена оставшаяся часть цепочки областей видимости. Другими словами, оператор with временно добавляет объект объект в конец внутреннего списка объектов, составляющих цепочку областей видимости среды выполнения Flash.
Например, чтобы обратиться к переменной РI внутреннего класса Math, мы обычно используем следующий код:
Math. PI:
Однако с помощью оператора with мы можем обратиться к переменной PI внутреннего класса Math без предварительного обращения к этому классу:
with (Math) { // Выполняем инструкции в контексте класса Math trace(PI): // Выводит: 3.1459… (поскольку переменная PI определена // в классе Math)
}
Некоторые разработчики находят оператор with полезным, когда создается код, в котором приходится часто обращаться к переменным и методам определенного объекта.
Руководство по actionscript. часть 2, стр. 133
К пространствам имен
В этой главе мы узнали, как язык ActionScript управляет доступностью определений в различных областях видимости. В следующей главе мы научимся использовать пространства имен для управления видимостью определений. Стоит отметить, что пространства имен являются важной частью внутренней архитектуры языка ActionScript, но в пользовательском коде они обычно применяются только в сложных ситуациях.
1ЛШ17
Пространства имен
В самых общих чертах, пространство имен — это набор имен, не содержащий дубликатов. Иными словами, внутри этого набора каждое имя является уникальным. Например, в английском языке названия фруктов могут считаться пространством имен, поскольку каждый фрукт имеет уникальное имя: apple (яблоко), реаг (груша), orange (апельсин) и т. д. Подобным образом пространством имен могут считаться названия цветов, поскольку каждый цвет обладает своим уникальным именем: blue (синий), green (зеленый), orange (оранжевый) и т. д.
Обратите внимание, что имя orange встречается в обеих группах имен. Имя orange само по себе не является уникальным — оно уникально только внутри каждой группы. В зависимости от того, идет разговор о фрукте или цвете, одно и то же имя orange может обозначать два различных предмета. В этом и заключается смысл пространств имен. Они позволяют одному и тому же имени (идентификатору) иметь различные значения в зависимости от контекста, в котором оно используется.
Что касается программирования, данная особенность пространств имен — «то же имя — другое значение» — обладает двумя общими преимуществами:
? позволяет программистам избежать конфликтов имен;
? дает возможность программе адаптировать свое поведение в соответствии с текущим контекстом.
В процессе изучения этой главы мы рассмотрим множество тонкостей, связанных с пространствами имен в языке ActionScript. Попытайтесь разобраться в теме так, чтобы различные подробности не уводили вас в сторону от относительной простоты пространств имен. По существу, пространства имен — это не более чем система именований, состоящая из двух частей. Они используются для того, чтобы отличать одну группу имен от другой, подобно тому как код города позволяет отличать один номер телефона от других телефонных номеров по всему миру.
Словарь пространств имен
В этой главе мы встретимся с несколькими новыми терминами, относящимися к пространствам имен. Некоторые наиболее важные из них приведены далее в виде краткого справочника. Сейчас бегло ознакомьтесь с этим списком, чтобы получить общее представление, а в дальнейшем возвращайтесь к нему всякий раз, когда вам понадобится памятка при изучении последующих разделов. В оставшейся части этой главы каждый из приведенных терминов рассматривается гораздо более подробно.
Локальное имя — локальная часть уточненного идентификатора, то есть имя, которое уточняется пространством имен. Например, orange в fruit: : orange.
Руководство по actionscript. часть 2, стр. 134
Название пространства имен — уникальное идентифицирующее название пространства имен, представленное в виде унифицированного идентификатора ресурса (URI — Uniform Resource Identifier). В языке ActionScript название пространства имен доступно через переменную экземпляра uri класса Namespace. В XML название пространства имен доступно через атрибут xmlns.
Префикс пространства имен — псевдоним названия пространства имен. Префиксы пространств имен используются только в языке XML, однако в ActionScript для упрощения операций расширения Е4Х к ним можно обращаться через переменную prefix класса Namespace.
Идентификатор пространства имен — идентификатор, используемый при определении пространства имен в языке ActionScript. Например, в следующем определении пространства имен fruit является идентификатором:
namespace fruit = «http://www. example. com/games/kidsgame/fruit»:
Открытое пространство имен — пространство имен, которое было добавлено в набор открытых пространств имен с помощью директивы use namespace.
Открытые пространства имен — набор пространств имен, просматриваемый компилятором при попытке разрешить неуточненные ссылки.
Уточняющее пространство имен — пространство имен, которое квалифицирует определение переменной или метода либо идентификатор пространства имен как уточненный идентификатор.
Уточненный идентификатор — идентификатор языка ActionScript, состоящий из двух частей и включающий идентификатор пространства имен и локальное имя, разделенные двумя двоеточиями. Например, fruit: : orange.
Пространства имен в языке ActionScript
В языке ActionScript пространство имен — это описатель для имени переменной, метода, XML-тега или XML-атрибута. Описатель ограничивает, или уточняет, значение идентификатора, позволяя нам сказать в коде, что «переменная orange является фруктом, а не цветом», или «метод search ( ) применяется для поиска в японском языке, а не в английском», или «тег