Просмотр полной версии : аргументы метода
Whatsername
19.04.2004, 10:40
Привет,
все выходные я много думал об ООП и судьбе России. Меня смущает область видимости аргументов метода.
function CompareFunction () {}
arrayName.sort (CompareFunction);
CompareFunction не свойство arrayName, почему же оно попадает в область действия метода??
не попадает.
ну, в том виде, в котором ты думаешь (становлюсь телепатом) :D
в теле функции его нет
но есть в мувике, в котором ты его написал.
то же самое записать можно так:
this.CompareFunction = function () {}
arrayName.sort (this.CompareFunction);
- так все встало на свои места?
интереснее вот такая конструкция:
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
область видимости и наследование. вот о чем речь собственно.
более того, многие авторы достаточно серьезных книг таки не воткнулись в тему.
например на мои вопросы к дебройлу с этим примером он ответил, что это наверное баг :D
хотя это не так.
объяснение такое:
1) любой объект, а также его наследники, суть вещь безымянная и всего лишь область памяти. Кстати и мувиклип тоже.
2) объект нельзя удалить напрямую. типа delete my_object
- таким образом мы удаляем лишь ссылку на него. но не сам объект.
3) объект может быть удален ТОЛЬКО сборщиком мусора, если на него не осталось ссылок. других вариантов нет.
- как это влияет на то, что мой пример работает?
- при вызове функции создается временный объект, который как минимум является наследником Object, в именном пространстве которого и хранятся все временные (var) переменные. Этот временный объект удаляется по окончании работы функции.
НО
как мы выяснили право удалять имеет только сборщик мусора.
и у нас осталась функция, которая имеет ссылку на переменную, находящуюся в этом объекте. соответственно у переменной осталась ссылка на объект-родитель и этот родитель не будет удален сборщиком мусора - ссылочка-то вот она!
Поэтому переменная не обнуляется.
- все работает правильно.
А что касается моего, то получается, что Compare действительно сначала ищется в свойствах Array - не ищется.
Это заблуждение. Создай Compare в этом массиве и увидищь, что обращения к нему не будет.
Если отсутствует явное указание пути к объекту, то флэш ищет в следующем порядке:
- в текущем мувиклипе
- в прототипе MovieClip
- в прототипе Object
- в _global
- вызывается функция __resolve
Nox Noctis
19.04.2004, 17:51
года полтора назад, помнится, мы тут с john'ом ломали копья, было совершенно не понятно с какой радости можно поменять временные переменные, являвшиеся аргументами функции, уже ПОСЛЕ того как эта функция завершила работу :)
и колин мук, кстати, это дело объясняет. сам видел :)
при вызове функции создаётся пространство имён, которое убивается только сборщиком мусора, который работает непонятно по какому принципу. я вот не нашел документации никакой по этому делу... может в СДК к плееру есть что-то ? не смотрел.
а чего копья ломать? я ж все объяснил :D
Nox Noctis
19.04.2004, 18:08
не хотел тебя огорчать, но это было объяснено на заре выхода шестёрки :)) в пятёрке как-то не наступалось на эти грабли...
странно, что дебройль не воткнул чего-то.. я думаю он тебя вообще не понял :)
дык. тогда и нашли объяснение. просто не здесь эта тема шоркалась. на руфлэш.
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
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 увеличивается:
без конката - каждый раз обрабатывается один и тот же массив, тогда как с конкатом десять разных... а время на отработку одного все равно больше... почему?
хотя вы наверное забыли этот вопрос, да и такая тема просит отдельного топика
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.