PDA

Просмотр полной версии : _global - объясните....


bit_studio
11.02.2004, 14:03
есть такое:

в основном мувике объявляю перемменную
_global. but_state = 2

во вложенном мувике делается проверка

if (but_state != num) {
trace (but_state); // выдает 2
but_state = 5;
}

из другого вложенного мувика

trace (but_state); // выдает 2

так я что внутренней переменной but_state присвоил 5?

если меняешь на _global.but_state = 5, то все нормально?

кто-нить кто знает может подробно объяснить как
_global работает???

Jlekc
11.02.2004, 14:33
напишиш так _global.but_state = 5и создаш переменную в глобале.
напишиш так but_state = 5 создаш переменную в данном мувики
Нада чётко указывать, де и чо ты хочеш присвоить

bit_studio
11.02.2004, 14:37
Оригинал написал(а) Jlekc
напишиш так _global.but_state = 5и создаш переменную в глобале.
напишиш так but_state = 5 создаш переменную в данном мувики
Нада чётко указывать, де и чо ты хочеш присвоить

это ясно, как мне ее изменить?

Jlekc
11.02.2004, 14:41
ты издеваешся?? :( смотри
_global.but_state = 5

bit_studio
11.02.2004, 23:16
Оригинал написал(а) Jlekc
ты издеваешся?? :( смотри
_global.but_state = 5

нет не издеваюсь, вопрос неправильный был, когда я указываю

var = but_state;

как флаш ищет переменную but_state, с начала глобальные и если нет то локальные в мувике, или наоборот???

З.Ы. для подстраховки если я хочу приравнять к глобальной переменной то обязательно указывать _global?

еще ....

_global.but = new Array (n);

for (i=1; i<=n; i++) {
but [i] = new Array ("id","name","url")
/// или надо _global.but [i]
}

Пушистик
12.02.2004, 00:51
я думаю флэш сначала будет рыться в глобальных переменных, а только потом локальных...

_global.but_state = 2;
function yo() {
var but_state=5;
trace(but_state);
}
yo();
trace(but_state);

ссылка на глобал не обязательна...он также доптупен без ссылки для заполнения локальных переменных...

_global.but_state = 2;
function yo() {
var oops=but_state;
trace(oops);
}
yo();

также для защиты от именения можно юзать ООП...
вот тут точна никак её не изменить!

пишешь где нибудь в руте...

function Yo() {
}
Yo.prototype.but_state = "привет!";
_global.myYo = new Yo();
из из любого места...
trace(myYo.__proto__.but_state);

iLoveYou
12.02.2004, 01:19
Оригинал написал(а) Пушистик
также для защиты от именения можно юзать ООП...
вот тут точна никак её не изменить!
пишешь где нибудь в руте...
function Yo() {
}
Yo.prototype.but_state = "привет!";
_global.myYo = new Yo();
из из любого места...
trace(myYo.__proto__.but_state);
объясни, плиз, что ты хотел этим сказать :)

Штрек
12.02.2004, 05:06
Оригинал написал(а) Sergey"iLoveYou"

объясни, плиз, что ты хотел этим сказать :)
Начинается школа. :p
На первый, второй расчитайсь. :p

Штрек
12.02.2004, 05:19
Оригинал написал(а) Пушистик
[function Yo() {
}
Yo.prototype.but_state = "привет!";
_global.myYo = new Yo();
из из любого места...
trace(myYo.__proto__.but_state);

Запуляй в кнопку
on(release){
myYo="Undefinedddddd"
}
и посмотри, что получится. :p

Пушистик
12.02.2004, 09:49
Штрек, я не имел ввиду именить объект, а изменить значение переменной... :p :p :p

Sergey"iLoveYou", тебе я даже отвечать ничё не буду...чтобы ты не мог потащится от того какие умные фразы тут ляпаешь:)

И ваще...я уже спал во время ответа :D

Пушистик
12.02.2004, 09:52
я походу ответил не в тему...мне показалось что речь шла о защите от изменения...тока щя начинаю понимать... :D

iLoveYou
12.02.2004, 13:52
Оригинал написал(а) Пушистик
Sergey"iLoveYou", тебе я даже отвечать ничё не буду...чтобы ты не мог потащится от того какие умные фразы тут ляпаешь:)

я походу ответил не в тему...мне показалось что речь шла о защите от изменения...тока щя начинаю понимать...
Би, заметь, ты повзрослел :) -- теперь ты не пытаешься возражать и даже имеешь силы отчасти признать свою неправоту -- раньше приходилось долго и в основном безуспешно переубеждать тебя. я безусловно рад твоим успехам:) единственное, жаль, что ты помнишь личные обиды, которые тебе никогда не наносили.

ЗЫ для защиты от изменения я бы использовал ASSetPropFlags:
например, ASSetPropFlags(_global, ["myvar"], 6, true);

Штрек
12.02.2004, 15:08
Оригинал написал(а) Sergey"iLoveYou"

раньше приходилось долго и в основном безуспешно переубеждать тебя. я безусловно рад твоим успехам:) единственное, жаль, что ты помнишь личные обиды, которые тебе никогда не наносили.


-- Киса, -- продолжал Остап, -- давайте и мы увековечимся.
Забьем Мике баки. У меня, кстати, и мел есть!
Ей-богу, полезу сейчас и напишу: "Киса и Ося здесь были"*. :p

Пушистик
12.02.2004, 15:33
Sergey"iLoveYou", во всём что ты говорил, говоришь и будешь говорить ты будешь прав и ни разу неправ! :D

bunker6
12.02.2004, 23:42
штрек, новую книжку прочитал? :D

Штрек
13.02.2004, 01:35
Оригинал написал(а) bunker6
штрек, новую книжку прочитал? :D
Лет эдак в пять, прочитав вот этот кусок :

-- Кому астролябию?! Дешево продается астролябия!!
Для делегаций и женотделов* скидка!
.................................................
-- Сама меряет, -- сказал молодой человек, передавая
астролябию покупателю, -- было бы что мерять.

я понял, что дядя Стёпа - гавн :p

Dagi
13.02.2004, 01:47
Подробное описание глобальных переменных от меня:



В чистом объектно-ориентированном программировании не существует понятия “глобальная переменная”. Все переменные (в данном случае правильнее употреблять термин “свойство”) являются локальными и не видны дальше “родного” объекта. До выхода Flash MX в ActionScript также не имелось возможности создавать глобальные переменные. Она появилась с введением особого свойства _global.
Свойство _global представляет собой указатель на объект Global (мы будем называть его именно Global, так как такой термин используется в ECMA-262), который является носителем конструкторов встроенных классов, глобальных функций и “родных” объектов ActionScript. Сохранив в нем переменную, вы сделаете ее доступной для любого исполнимого кода фильма. Более того, ее можно будет “увидеть” и из других фильмов, подгруженных в проигрыватель. Указывать при этом ее точный “адрес” не нужно.
_global.new_var=”Global”; // Этот код добавляем на первый кадр _root
// На временной диаграмме вложенного в _root клипа вводим:
trace(new_var) // Выводит: Global
Создавая глобальную переменную, важно проследить, чтобы ее имя не совпало с именем ни одного из свойств объектов, относящихся к текущей цепочке областей видимости. Это связано с тем, что объект Global завершает цепочку областей видимости любого исполнимого кода, поэтому, вполне вероятно, что до глобальной переменной интерпретатор может и не добраться, найдя подходящий элемент и “поближе”. Так, если вы вызываете переменную из кода функции, расположенной на основной временной диаграмме, то вначале на ее наличие будет проверен относящийся к функции скрипт, затем – область _root, далее – прототип конструктора MovieClip, за ним – прототип конструктора Object, и лишь затем будет анализироваться объект Global:
_global.new_var="Привет"; // Этот код расположен на основной временной
// диаграмме
trace(new_var); // Выводит: Привет
// Создаем одноименное глобальной переменной свойство в одной из областей
// цепочки видимости
MovieClip.prototype.new_var="Пока";
trace(new_var); // Выводит: Пока (прототип MovieClip расположен
// “ближе” Global)
Переопределить глобальную переменную, указав только ее имя, невозможно. При этом будет создана новая локальная переменная. Для того чтобы изменить глобальную переменную, необходимо использовать ее полный “адрес”:
_global.prop = "Привет"; // Создаем глобальную переменную
prop = "Пока"; // Пробуем переопределить глобальную переменную
trace(prop); // Выводит: Пока (была создана локальная переменная)
trace(_global.prop); // Выводит: Привет (глобальная переменная изменена
// не была)
_global.prop="Пока"; // Переопределяем переменную по точному “адресу”
trace(_global.prop); // Выводит: Пока
Для глобальных переменных в ActionScript характерна двойственная природа. С одной стороны, они действительно во многом ведут себя, как переменные. Однако, фактически, они являются свойствами объекта Global, поэтому их вряд ли можно считать стопроцентными переменными. Наглядным же доказательством этого утверждения является то, что при создании глобальных переменных не используется ключевого слова var.
Во Flash 5 свойства _global не было. Однако создавать некоторое подобие глобальных переменных все же было возможно благодаря особенностям формирования цепочек областей видимости. Дело в том, что в цепочку областей видимости любого исполнимого кода, будь то код временной диаграммы или код функции, входит прототип конструктора Object (вернее, его свойства наследует входящий в цепочку областей видимости клип-носитель кода). Следовательно, любой исполнимый код наследует хранящиеся в нем компоненты. Благодаря этому, создав свойство прототипа класса Object, мы сможем добиться практически полной имитации глобальной переменной.
Вы можете спросить, если свойства объекта Global и прототипа конструктора Object в одинаковой степени обладают глобальной видимостью, то какая разница, какой путь использовать для эмуляции глобальных переменных. А разница имеется – и весьма существенная. Чтобы ее понять, разделим термины “глобальная переменная” и “глобальное свойство”. Глобальная переменная – это переменная, доступная для любого исполнимого кода. Глобальное свойство – это свойство, наследуемое объектами всех классов. Глобальная переменная сохраняется в объекте, находящемся в вершине цепочки областей видимости любого исполнимого кода - объекте Global. Глобальное свойство – это свойство прототипа, завершающего цепочку прототипов, присущую любому объекту. В ActionScript таким прототипом является прототип конструктора Object Разделение понятий “глобальная переменная” и “глобальное свойство” осложняется тем, что прототип конструктора Object входит как в любую цепочку прототипов, так и, косвенно, в любую цепочку областей видимости (что связано с тем, что код располагается на кадре временной диаграммы). По этой причине, его свойство будет доступно и в качестве переменной любого исполнимого кода, и как свойство любого объекта:
Object.prototype.new_var="Привет";
trace(new_var); // Выводит: Привет (new_var доступна для данного
// исполнимого кода)
trace([].new_var); // Выводит: Привет (new_var унаследовал класс Array)
Таким образом, свойство прототипа объекта Object можно одновременно рассматривать и как глобальную переменную, и как глобальное свойство. И это очень плохо, так как приводит к полнейшей путаницы в понятиях. Создавая глобальные переменные при помощи свойств объекта Global, вы хоть как-то сохраняете ту стройность языка, которую предусматривает ECMA-262, и которая была очень сильно нарушена при реализации ActionScript.

bit_studio
13.02.2004, 11:13
Оригинал написал(а) Dagi
Подробное описание глобальных переменных от меня:....


Вот теперь все понятно... Санкс