Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   аргументы метода (http://www.flasher.ru/forum/showthread.php?t=57193)

Whatsername 19.04.2004 10:40

аргументы метода
 
Привет,
все выходные я много думал об ООП и судьбе России. Меня смущает область видимости аргументов метода.

function CompareFunction () {}
arrayName.sort (CompareFunction);

CompareFunction не свойство arrayName, почему же оно попадает в область действия метода??

Iv 19.04.2004 11:27

не попадает.
ну, в том виде, в котором ты думаешь (становлюсь телепатом) :D

в теле функции его нет
но есть в мувике, в котором ты его написал.
то же самое записать можно так:

this.CompareFunction = function () {}
arrayName.sort (this.CompareFunction);

- так все встало на свои места?

Iv 19.04.2004 11:31

интереснее вот такая конструкция:

this.insideTest = function() {
var bla = 0;
this.test = function() {
trace(++bla);
};
};
this.insideTest()
this.onMouseUp = function() {
this.test()
};

Whatsername 19.04.2004 17:07

О, спасибо за интересные примеры. Почему работает последний я все-таки еще не вник.
А что касается моего, то получается, что Compare действительно сначала ищется в свойствах Array, потом еще где-то, потом в _root, а потом в Object.prototype, верно? Я бредово объясняю, но у Мук эту тему не очень подробно затрагивает.
ваще флуд получился, ты на этот раз понимаешь что я хотел сказать? :D

Iv 19.04.2004 17:39

область видимости и наследование. вот о чем речь собственно.

более того, многие авторы достаточно серьезных книг таки не воткнулись в тему.
например на мои вопросы к дебройлу с этим примером он ответил, что это наверное баг :D

хотя это не так.

объяснение такое:

1) любой объект, а также его наследники, суть вещь безымянная и всего лишь область памяти. Кстати и мувиклип тоже.
2) объект нельзя удалить напрямую. типа delete my_object
- таким образом мы удаляем лишь ссылку на него. но не сам объект.
3) объект может быть удален ТОЛЬКО сборщиком мусора, если на него не осталось ссылок. других вариантов нет.

- как это влияет на то, что мой пример работает?
- при вызове функции создается временный объект, который как минимум является наследником Object, в именном пространстве которого и хранятся все временные (var) переменные. Этот временный объект удаляется по окончании работы функции.
НО
как мы выяснили право удалять имеет только сборщик мусора.
и у нас осталась функция, которая имеет ссылку на переменную, находящуюся в этом объекте. соответственно у переменной осталась ссылка на объект-родитель и этот родитель не будет удален сборщиком мусора - ссылочка-то вот она!

Поэтому переменная не обнуляется.
- все работает правильно.

Iv 19.04.2004 17:45

Цитата:

А что касается моего, то получается, что Compare действительно сначала ищется в свойствах Array
- не ищется.
Это заблуждение. Создай Compare в этом массиве и увидищь, что обращения к нему не будет.

Если отсутствует явное указание пути к объекту, то флэш ищет в следующем порядке:
- в текущем мувиклипе
- в прототипе MovieClip
- в прототипе Object
- в _global
- вызывается функция __resolve

Nox Noctis 19.04.2004 17:51

года полтора назад, помнится, мы тут с john'ом ломали копья, было совершенно не понятно с какой радости можно поменять временные переменные, являвшиеся аргументами функции, уже ПОСЛЕ того как эта функция завершила работу :)

и колин мук, кстати, это дело объясняет. сам видел :)

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

Iv 19.04.2004 18:01

а чего копья ломать? я ж все объяснил :D

Nox Noctis 19.04.2004 18:08

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

странно, что дебройль не воткнул чего-то.. я думаю он тебя вообще не понял :)

Iv 19.04.2004 18:24

дык. тогда и нашли объяснение. просто не здесь эта тема шоркалась. на руфлэш.


Часовой пояс GMT +4, время: 09:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.