![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
izOne, я написал, что можно удалить анонимную функцию, и это немного отличается от того, чтобы удалить "не имея указателя на функцию". Даже prototype.js сохраняет все параметры, передаваемые в метод Event.observe, в Event.observers. Т.е. указатели все же имеются. И значит в этом массиве при желании можно "отыскать" нужные параметры и вызвать с ними Event.stopObserving. Но такой подход библиотека не поддерживает.
Для вашего случая, когда один элемент для события, к примеру, mousemove имеет только один обработчик, такой вариант мог бы подойти. Однако для "тяжелых случаев", когда для одного элемента будут заданы несколько анонимных функций для обработки одного события, соответственно придется "выдумывать" более изощренные способы "борьбы" с анонимностью. Вот так, вкратце. Это, наверно, не совсем то, чтобы Вы надеялись узнать от меня. Ведь Вам вряд ли захочется браться за модификацию методов библиотеки - Event.unloadCache&Event.stopObserving... |
|||
|
||||
izOne |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 22.8.2003 Где: Украина, Киев Репутация: нет Всего: 4 |
AKS,
Именно это и хотелось услышать ;) Только вот с анонимностью запутался: если есть указатель-название, то тогда функция уже именованая?...
По коду, вроде как, это только для IE сделано(unloadCache)...
Не-не-не ![]() Еще раз спасибо. --------------------
Успех ждет каждого, но иногда всю жизнь. |
||||
|
|||||
Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Ещё раз внимательно прочитать: в JS есть только переменные. Всё остальное значения, функция в том числе.
В итоге можно держать сколько угодно ссылок на значение-функции, имени как такового у неё нет. Перечитывать пост до полного просветления. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
AKS |
|
||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Имя функции - это тот идентификатор, который может (опционально) быть указан после ключевого слова function. Если его нет - функция анонимная, и никакое присвоение не сделает ее именованной. Взглянув на пример Sardar'а, можно заметить следующее. Именованная функция function test (в данном случае это не эвивалент записи var test = function () ) создает одноименную переменную test. Эта переменная создается в том контексте, где была создана эта function declaration. Переменную test позже можно "забить" ("убить") чем-то другим (90, например). Но, сохранив ссылку на эту именованную функцию в b, мы по-прежнему имеем эту самую function test в памяти (вызовите alert(b) и Вы увидите ее сериализацию), и сохранится она в таком "неприкосновенном" виде до тех пор, пока будут существовать ссылки на этот объект function test. Возвращаясь к нашему случаю, можно отметить еще кое-что. Несмотря на то, что функция будет находиться в массиве Event.observers, она как была анонимной, так по-прежнему будет оставаться таковой. И в нашем распоряжении нет ни идентификатора, которому оператор присвоения назначил бы ссылку на эту функцию, нет даже индекса, по которому мы бы могли ее отыскать в массиве. Так что, в-О-О-бще "полнейшая анонимность", чего уж тут вспоминать об именованности ;)...
Вот я о том и написал. Сделано только для события unload, а не иначе. Можно было бы вызывать этот метод из Event.stopObserving в том случае, если параметр observer не передан в stopObserving. В таком случае передав в Event.unloadCache ссылку на элемент и имя события можно было бы сделать то, о чем я уже написал. Но весомых аргументов для модификации нет, поскольку всегда есть возможность обойтись без этого (как Вы и сделали), присваивая заранее ссылки на функции. |
||||
|
|||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Вывод на toString() это единственное где можно встретить былое "имя" функции. Более оно никак себя не проявляет. Если у тебя получается как то использовать этот факт, то вероятно понятия "анонимные" и "не анонимные" для тебя значимы. С практической точки зрения (и с реализации тоже) имени у функции нет (на toString видим часть исходника как он был захвачен, а не восстановленное в текст AST или байткод, отсюда имя сохраняется). А вообще флейм пошёл ![]() -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |