PDA

Просмотр полной версии : проблема с видимостью переменной во вложенном функции


darksranger
27.09.2008, 01:57
вобщем такая ситуация


class ... {
public samePeremen:Number = 1
public function .... (){
xml .....
xml.onLoad = function () {
.....
trace (samePeremen) // undefined
}

}


переменная не видна во вложенной функции

конечно можно использовать delegate, в некоторых функциях передавать напрямую, но все это не то, как то можно определить переменную, которая бы была видна во всех методах\функциях ?

PS код схематичный, но думаю смысл вопроса понятен
Спасибо !

Wolsh
27.09.2008, 02:20
Так объявите ее как положено. Положено с var ))
Впрочем это Вы наверно здесь поспешили. Вобщем просто так не надо делать. Безымянные вложенные функции в классе - самое страшное зло. Надо назначить нормальную приват функцию-обработчик, с именем и в теле класса.
class ... {
public var samePeremen:Number = 1
public function .... (){
xml .....
xml.onLoad = xmlIsLoaded;
}
private function xmlIsLoaded (ok:Boolean) {
.....
trace (samePeremen) // undefined ?
}
}

darksranger
27.09.2008, 03:08
Wolsh Приветствую!
как вы правильно заметили, я просто поторопился
( знаю, что самое зло :) уже собственно делегэйтом обошелся, просто переписываю старые наработки в классы и натыкаюсь на артефакты :))))

да и кстате
class ... {
public var samePeremen:Number = 1
public function .... (){
xml .....
xml.onLoad = xmlIsLoaded;
}
private function xmlIsLoaded (ok:Boolean) {
.....
trace (samePeremen) // undefined ? - true
}


а вот так


class ... {
public var samePeremen:Number = 1
public function .... (){
xml .....
xml.onLoad = mx.utils.Delegate.create(this, xmlIsLoaded);
}
private function xmlIsLoaded (ok:Boolean) {
.....
trace (samePeremen) // undefined ? - false :) тоесть 1 :)
}
}
}

но мало ли кому то нужно будет, конечно лучше через delegate !!!, но мало ли ( всякое бывает ) можно сделать так

class ... {
public samePeremen:Number = 1
public function .... (){
xml .....
var _samePeremen:Number = samePeremen
xml.onLoad = function () {
.....
trace (_samePeremen) // 1
}

}

тоесть на сколько я понял, видимость распостроняется на один, так сказать уровень, тоесть переменная объявленная в методе, будет доступна, в функции в этом методе :), как то так :) но сам я решил, все через delegate, чего и вам советую !

Wolsh
27.09.2008, 11:58
Блин, месяц попишешь на АС3 и забываешь АС2 как страшный сон... Да, конечно в АС2 Делегата надо, я совсем забыл, извините.

Psycho Tiger
27.09.2008, 15:48
Неужели AS3 для кодера на AS2 кажется раем? )

Wolsh
27.09.2008, 16:42
Не знаю... В АС2 я сражался с флэшем, чтобы заставить его делать так, как я хочу.
АС3 смотрит на меня умными глазами, словно говорит "Чего желаете, хозяин? Щас всё сделаем!"))))))))
Да, "рай" - наиболее подходящее слово.
Наверно потому, что я не "кодер на АС2", а обычный дизайнер))))

darksranger
27.09.2008, 20:04
ну у меня просто активный проэкт на АС2 и времени его переписывать на АС3 нету :(
а так я бы с удовольствием на АС3 все писал, буквально после закрытия этого проэкта, сяду для переписки всех наработок в АС3 :)