PDA

Просмотр полной версии : аргументы метода


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
дык. тогда и нашли объяснение. просто не здесь эта тема шоркалась. на руфлэш.

Whatsername
20.04.2004, 17:28
А я помню как Nox Noctis переписывал два листа кодов Дебройла : ) Но все вышло очень красиво в итоге.
Спасибо за разъяснения, BitSky, ты это сильно задвинул, но теперь все понятно. Спасибо большое : )
Nox Noctis, так ты из ленингаарда? Может я когда-нибудь угощу тебя пивом? :)

Nox Noctis
20.04.2004, 17:45
нимало не возражаю.. отметим выход второго издания Мука что ли... :D

Whatsername
20.04.2004, 18:53
2 Nox Noctis: Супер :D Отличный повод! Экземпляр для меня подпишешь? :D Я тебе email'ю, окей?
2 BitSky: Спасибо еще раз. Я все глубже постигаю твой пример. Сила : )

Nox Noctis
20.04.2004, 19:03
неспортивно чужие книжки подписывать :D

вон давай к Иву в очередь за автографами лучше встанем :)

Whatsername
20.04.2004, 19:37
Иву? а это кто?

// а Ivan Dembicki : ) Да, истый флешер : )

Whatsername
20.04.2004, 20:43
Позвольте, я еще покажу вам один код по наитию Мука.

Вот что он мне поручил:
"Прикрепите нечувствительную функцию сортировки по алфавиту к классу Array в качестве наследуемого метода."
Тогда у меня и возник вопрос по области видимости аргументов. Такая не слишком корявая?


Array.prototype.compareFunction = function(element1, element2) {
return (element1.toLowerCase()>element2.toLowerCase());
};
Array.prototype.sortbyAlph = function() {
this.sort(this.compareFunction);
};
//
x = ["Zebra", "ape"];
x.sortbyAlph();
trace(x); // ape,Zebra

Iv
20.04.2004, 20:49
такая оч пральная

Nox Noctis
21.04.2004, 01:43
вобщем-то всё правильно и работает.
но.
имха, не стоит отступать от буквы мануала там где это не принципиально :)

ведь сказано же:
compareFunction can have one of the following three values:

-1 if A should appear before B in the sorted sequence
0 if A = B
1 if A should appear after B in the sorted sequence
теперь сравните: (не исключено что я где-то ошибся при тестах, но разница очень уж велика...)

1. твой вариант.
Array.prototype.compareFunction = function(element1, element2) {
return (element1.toLowerCase()>element2.toLowerCase());
};
Array.prototype.sortbyAlph = function() {
this.sort(this.compareFunction);
};
//
x = [];
for (var i = 0; i<100; i++) {
x.push(chr(32+i));
}
//
heap = [];
for (var i = 0; i<10; i++) {
heap.push(x.concat());
}
var s = getTimer();
for (var i = 0; i<10; i++) {
heap[i].sortbyAlph();
}
var e = getTimer();
trace(e-s);

2. вариант честный. (я машинально делаю так :) )
Array.prototype.compareFunction = function(element1, element2) {
var e1 = element1.toLowerCase();
var e2 = element2.toLowerCase();
return Number(e1<e2 || (e1>e2)*(-1));
};
Array.prototype.sortbyAlph = function() {
this.sort(this.compareFunction);
};
//
x = [];
for (var i = 0; i<100; i++) {
x.push(chr(32+i));
}
//
heap = [];
for (var i = 0; i<10; i++) {
heap.push(x.concat());
}
var s = getTimer();
for (var i = 0; i<10; i++) {
heap[i].sortbyAlph();
heap[i].reverse();
}
var e = getTimer();
trace(e-s);
тестил на компе: П3, 667мхз, 384мб СДрам. получил разницу в пол секунды и выше. я бы сказал что разница критическая :) хотя понятное дело что и так и так работать будет.

причем это взят массив всего в 100 элементов, состоящий из чаров. если возьмем строки длиной больше 1 - разница будет еще существеннее, что-то мне подсказывает. (не проверял)

Whatsername
21.04.2004, 20:00
Nox Noctis, твоя compareFunction - гимн остроумию, но вот результаты моих пяти тестов:

У меня trace(e-s):
4859 4897 4834 4905 5048
У тебя trace(e-s):
6908 6838 6863 6815 6828

Хотя твой пример должен отрабатывать совершенно точно быстрее. (??)

У меня еще два вопроса:
a)Зачем нужна heap[i].reverse() в твоем примере?
b)Странная строчка "heap.push(x.concat())", Moock said, concat() должен принимать аргументы и возвращать новый массив. Reference said: "concat returns: Nothing". кому верить?

Nox Noctis
21.04.2004, 23:38
тупо копирую код, который выше и проверяю:

вариант 1: 3378 3371 3608 3604 3355
вариант 2: 2836 2858 2844 2823 2853

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

ээ... я неспроста основные сведения о конфигурации компа на котором тестил написал. ты на каком компе проверял ?


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

вопрос б) конкат() - это простой способ скопироваьт массив. получить копию массива без прямого перебора :) не верь мануалу, мук дело говорит :) конкат слепливает исходный массив и то который в параметре. а если в параметре пусто - то возвращается НОВЫЙ массив, содержащий все эелементы исходного.

sergwizard
22.04.2004, 02:29
Вариант 1:
4444 4433 4430 4430
Вариант 2:
6342 6317 6308 6315

Компутер П3, 866МГц, 384МГб

Nox Noctis
22.04.2004, 02:34
хотите сказать мой комп мне подыгрывает ? :D

завтра на работе проверю. там машина-зверь..

Nox Noctis
22.04.2004, 02:40
оййй... знаете, я тут пробакланил слегка :)

я тестил в редакторе МХ2004, публикуя под шестёрку и получал хорошие результаты :)

потестил в редакторе МХ2003 - результат очень плохой :)

тут вы правы.

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

такие дела...

sergwizard
22.04.2004, 02:54
Зная честность Nox(a) и то, что он не будет подтасовывать результаты теста, пребываю в недоумении. Перезагружаюсь в Windows 98. Проверяю. Результаты те же. Перегружаюсь в Windows 2003 Server. Результаты немного лучше, но соотношение то же, в пользу первого варианта. Чешу затылок. Потом вспоминаю, что Nox как-то писал, что Flash 2004 MX у него открыт постоянно. Ага! Flash 2004!
Открываю его, проверяю, и вот что получается:
Если в сеттинге установить "для 6-го плеера", то результат тот, который я написал. Но, если установить "для 7-го плеера", то результат такой:
Вариант 1
2400 2395 2395 2395
Вариант 2
2020 2012 2015 2012

Ups, я, по-моему, опаздал. :)

sergwizard
22.04.2004, 02:55
Зная честность Nox(a) и то, что он не будет подтасовывать результаты теста, пребываю в недоумении. Перезагружаюсь в Windows 98. Проверяю. Результаты те же. Перегружаюсь в Windows 2003 Server. Результаты немного лучше, но соотношение то же, в пользу первого варианта. Чешу затылок. Потом вспоминаю, что Nox как-то писал, что Flash 2004 MX у него открыт постоянно. Ага! Flash 2004!
Открываю его, проверяю, и вот что получается:
Если в сеттинге установить "для 6-го плеера", то результат тот, который я написал. Но, если установить "для 7-го плеера", то результат такой:
Вариант 1
2400 2395 2395 2395
Вариант 2
2020 2012 2015 2012

Ups, я, по-моему, опоздал. :)

Whatsername
23.04.2004, 01:59
Возможно cFunction будет работать в семерке еще эффективней если учитывать три результата:

Array.prototype.compareFunction = function(element1, element2) {
var e1 = element1.toLowerCase();
var e2 = element2.toLowerCase();
if (e1 == e2) {
return 0;
} else {
return Number(e1<e2 || (e1>e2)*(-1));
}
};

но шестой плеер отрабатывает код еще дольше.

В любом случае cFunction Nox Noctis эстетичнее : ) но вот штуку с конкатом я не понял. а потому взял и вырезал ее: на heap это не отыгралось, а время отработки увеличилось на 20%.

Whatsername
10.06.2004, 20:27
"штуку с конкатом" я теперь понял...
но меня смущает, что время обработки heap увеличивается:
без конката - каждый раз обрабатывается один и тот же массив, тогда как с конкатом десять разных... а время на отработку одного все равно больше... почему?

хотя вы наверное забыли этот вопрос, да и такая тема просит отдельного топика