2013-03-18 3 views
0
public class Main extends MovieClip { 

    public function Main():void { 
    getOne() 
    } 

    function getOne():void { 
     var varOne:Boolean = false; 

     stage.addEventListener(MouseEvent.CLICK, dunClicked); 
    } 

    function dunClicked(e:Event):void { 
     if(!varOne) trace("Nope..."); 
    } 
} 

Теперь ... Я знаю, что если я поместил varOne в класс, это будет рассматриваться как своего рода глобальная переменная (пожалуйста, исправьте меня, если я ошибаюсь ...) Мне было интересно, есть ли другой способ для EventListener увидеть значение varOne?Разрешить прослушиватель событий доступ к переменной вне ее функции

+2

Объявление «varOne» как члена основного класса - это правильная вещь. Это не будет глобальным, это будет свойство этого экземпляра класса. Технически вы получите доступ к нему, написав «this.varOne», который также может быть записан как «varOne», как вы хотите. – Philippe

+0

@Philippe, если это правильный метод, отправьте его в качестве ответа, и я с удовольствием изменю то, что выбрал. – Mechaflash

ответ

1

Объявление «varOne» как члена основного класса - лучшее, что нужно сделать. Создание закрытия (внутренняя функция) определенно работает тоже, но не очень хорошая практика, потому что вы не можете удалить прослушиватель событий, определенный с помощью такой анонимной функции.

Это не будет «глобальным», но является свойством этого экземпляра класса, к которому вы должны технически получить доступ, написав «this.varOne» (и «this.getOne()», «this.dunClicked» .. .), но в AS3/Java/etc. вы можете просто написать «varOne».

public class Main extends MovieClip { 

    private var varOne:Boolean; // defaults to false; 

    public function Main():void { 
     getOne() 
    } 

    function getOne():void { 
     stage.addEventListener(MouseEvent.CLICK, dunClicked); 
    } 

    function dunClicked(e:Event):void { 
     if (!varOne) trace("Nope..."); 
     // if (!this.varOne) trace("Nope..."); // this is equivalent 
    } 
} 
0

Вы можете поместить слушателя внутрь функции, поэтому он станет закрытием и будет иметь доступ к локальным функциям vars.

function getOne():void { 
    var varOne:Boolean = false; 

    stage.addEventListener(MouseEvent.CLICK, dunClicked); 

    function dunClicked(e:Event):void { 
    if(!varOne) trace("Nope..."); 
    } 
} 
+0

я чувствую себя супер немым ... я не знал, что могу вложить такие функции ... и я делаю это в течение месяца = /. Спасибо, Вита. – Mechaflash

+3

На самом деле, я бы не предложил использовать этот подход слишком сильно, потому что читаемость и поддержка кода пострадали бы. Просто используйте классовые классы и обычные методы. – Vitamon

+2

Это очень плохой опыт **. Вы ограничиваете область действия обработчика, и вам также приходится иметь дело с проблемами памяти (каждый раз, когда выполняется getOne(), dunClicked() создается и сохраняется в памяти. Таким образом, вы делаете это для 100 объектов, теперь оно создается 100 раз, а не просто один раз). Базовая стандартная практика программирования: ** никогда ** функции гнезда и ** никогда ** не определяют функции встроенные. –

Смежные вопросы