Цитата:
Сообщение от udaaff
(Сообщение 834938)
Конструктор не может возвращать никаких значений, даже если захочет, поэтому явно показывать это не нужно. Методы же, напротив, могут возвращать значение, а могут не возвращать, поэтому нужно явно указывать это, чтобы было понятно, что разработчик не забыл его там написать. Также отсутствие void у конструктора помогает отличить его от метода.
|
У методов, если они не возвращают ничего, можно и не писать :void - интерпретатор это поймет по наличию/отсутствию ключевого слова return.
А имя конструктора в си-подобных синтаксисах всегда такое же, как и имя класса - и только этого с лихвой хватает, чтобы не спутать конструктор ни с чем другим (к тому же можно смотреть так: ф-я, начинающаяся в большой буквы и есть конструктор). Ведь нельзя читать-воспринимать код класса вне его контекста.
З.Ы. А в Delphi, например, конструктор определяется словам constructor.
Цитата:
Сообщение от vvvvvvf
(Сообщение 835025)
Код AS3:
var mySp:Sprite = new Sprite();
mySp.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
trace('enter frame');
});
У меня сложилось такое впечатление, что подобный код будет сильно засорять память.
Я где-то прочитал, что если вызывать подобную конструкцию, то при каждом запуске события функция и все её содержимое создается заново, а предыдущая её версия не удаляется.
Правда ли это?
|
Правда. Но если это всегда держать в голове - то это нормально. Т.е. если вы вешаете на одно событие один обработчик и не планируете его удалять в процессие исполнения кода - то можете так делать. Ничего страшного, если такое не далается в цикле и т.п.
Детальнее: сам код/значение вычищается из памяти, когда на на него никто больше не ссылается. Грубо говоря, в данном примере на него ссылается EventListener. Когда он перестанет ссылаться, код удалится из памяти. Но чтобы он перестал ссылаться - нужно сделать removeEventListener. В этом примере вам это не удастся. Нужно иметь ссылки на ф-ю, которуй вы удаляете из EventListener. А ссылка эта в примере не сохраняется ни в какую переменную - она генерируется "на лету" и сразу в стек параметров. Поэтому вы не сможете ее узнать.
Вот иной вариант:
Код AS3:
var mySp:Sprite = new Sprite();
var f:Function = f(){trace('yo!'); mySp.removeEventListener(Event.ENTER_FRAME, f)};
mySp.addEventListener(Event.ENTER_FRAME, f);
Но!!! Не используйте бездумно подобный код! Ибо за пределами видимости переменных mySp и f не будет! Учитывайте это!
|