Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2868 / 252 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 3:

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

Обращение к полям "вложенных" объектов

Во Флэш МХ обращение по имени, фактически, может быть использовано вместо указателей. Оставляя за скобками вопрос о том, приемлема ли подобная практика с точки зрения стиля программирования, подумаем о возможных сложностях ее применения. Предположим, вы написали функцию, в которую передается имя переменной, с которой она будет работать. Поначалу вы передаете туда переменные, заведенные непосредственно в том же клипе, в котором вы завели вашу функцию. Но затем вы можете захотеть передать туда, например, поле объекта, "вложенного" в ваш клип (кавычки здесь стоят по той причине, что на самом деле в вашем клипе хранится только ссылка на "вложенный" объект). То есть строка, описывающая это поле, будет выглядеть примерно так: " а.х ". В этом случае использование eval - единственный вариант, а квадратные скобки уже не сработают. Вот пример, который иллюстрирует все вышесказанное. (Обратите внимание: ряд строчек в примере мы формируем с помощью одинарных кавычек - просто потому, что двойные уже заняты. Также обратите внимание, что клип, в котором мы сейчас работаем, - это _root . Но можно было с тем же успехом вместо _root писать this ).

a = {};
a.x = 10;
b = 15;
obj = "a";
field = "x";
// Оба варианта работают
trace('eval(obj + "." + field) = ' + eval(obj + "." + field));
trace('_root[obj][field] = ' + _root[obj][field]);
path1 = obj + "." + field;
path2 = "b";
// Работает только первый вариант
trace('eval(path1) = ' + eval(path1));
trace('_root[path1] = ' + _root[path1]);
// Оба варианта работают
trace('eval(path2) = ' + eval(path2));
trace('_root[path2] = ' + _root[path2]);

После запуска этого примера в консоли получаем:

eval(obj + "." + field) = 10
_root[obj][field] = 10
eval(path1) = 10
_root[path1] =
eval(path2) = 15
_root[path2] = 15

То есть запись, в которой в квадратные скобки была передана строка с точкой внутри, не сработала; все же остальное работает нормально.

Создание переменной (поля)

Чтобы создать новую переменную по имени, оператора eval нам будет недостаточно. Выражение, которое он возвращает, не является lvalue, то есть "пригодным для употребления слева от оператора присваивания". Если мы хотим создавать новые переменные по имени, нужно пользоваться оператором set . (В References этот оператор упомянут в разделе Actions). Синтаксис его такой же, как у вызова функции с двумя аргументами; причем, первым аргументом является имя переменной, а вторым - значение, которое нужно этой переменной присвоить. С полями объектов, вложенных в текущий (иными словами - со строкой имени, в которой встречается точка), оператор set не работает. Вот пример: код

set("s", 33);
trace('eval("s") = ' + eval("s"));
set("s1.y", 33);
trace('eval("s1.y") = ' + eval("s1.y"));

выдает на выходе

eval("s") = 33
eval("s1.y") =

Ограничения по сравнению с ECMA-262 ver.3

Мы уже говорили о том, что язык ActionScript 1.0, в основном, соответствует третьей версии стандарта ECMA-262. Однако некоторые из упомянутых в стандарте вещей не вошли в ActionScript 1.0. Из этих вещей можно отметить отсутствие ряда встроенных объектов (например, объектов для работы с регулярными выражениями и с ошибками). Но сейчас мы должны сделать акцент на том, что возможности оператора eval в ActionScript существенно урезаны по сравнению как со стандартом, так и с хорошо известным языком JavaScript. А именно, в отличие от ECMA-262 v.3 или JavaScript, во Flash MX оператор eval может вычислять только значения выражений. Оттранслировать же кусочек кода, выражением не являющийся (а содержащий управляющие конструкции или же определения функций, создание объектов и массивов и т.д.), оператор eval не может. А ведь в JavaScript, скажем, в eval можно передать для трансляции достаточно сложный код. Решение разработчиков Флэш урезать функциональность этого оператора объясняется достаточно просто. Поскольку Флэш-плеер предназначен для загрузки с сайта Macromedia (не во все версии браузеров входит последняя версия плеера), то его размер должен быть минимален. Поэтому были приняты все меры, чтобы оставить "за бортом" плеера сложный лексический анализатор и компилятор, выдающий нечто вроде байт-кода. И, в частности, была урезана функциональность eval - ведь для реализации обработки им любого кода все эти инструменты пришлось бы интегрировать в плеер.