Как говорится, всё новое — хорошо забытое старое. Практически все литературные сюжеты (как и композиции в музыке) повторяют в каком-то виде то, что было до этого, но это не мешает некоторым их них лежать в основе по-настоящему великих произведений.
А я недавно с таким же изумлением наткнулся на книгу Азимова «Популярная анатомия». :) Купил не раздумывая, хоть и никогда не интересовался подобным — теперь на очереди на прочтение. :)
Для меня JSLint тоже средство совершенно незаменимое, т.к. сам разрабатываю довольно непростой фреймворк (для карт). Особенно критичны две вещи: точки с запятыми (чтобы код не ломался после сборки различного рода компрессорами — сам пользуюсь рубишным packr, работающим по алгоритму Крокфорда) и отсутствие глобальных переменных (узкоспециализированный фреймворк не может себе такого позволить, чтобы избежать конфликтов с другими).
Хочется добавить к вышесказанному, что самое глупое занятие у композитора — ждать вдохновения. По многолетнему опыту меня и многих других людей, занимающихся творчеством, вдохновение приходит во время процесса, а не перед ним. Так что заниматься нужно регулярно, не откладывать на моменты провидения, даже если сразу не всё получается.
Кстати, мы (украинская группа Обійми Дощу) недавно выпустили дебютный альбом — это грустный, по-осеннему лиричный прогрессив рок с элементами неоклассики (много живых струнных), можно скачать с сайта бесплатно. Можете послушать как пример того, к чему можно прийти, не имея музыкального образования — только энтузиазм и желание трудиться, не сдаваясь.
Раз мы что-то удалили — оно должно взять, да удалиться и нигде больше не учитываться _при последующих событиях_, а не _предыдущих_. :) По-моему вполне логично.
А в твоём варианте действительно очень нужна оптимизация. :) А то тут получается целых три (!) вложенных друг в друга цикла (while, один for и другой в indexOf), при чём еще с кучей промежуточных вызовов функций, что вместе очень сильно должно тормозить по сравнению с одним циклом с прямыми обращениями к массиву без вызовов, как у меня.
Я об этом думал. :) На самом деле то, что листенер файрится даже после удаления, является ожидаемым поведением, т.к. листенер по определению должен исполниться сразу после файринга ивента только в том случае, если он на него подписан. Т.е. добавление/удаление листенера должно произойти до файра, чтобы он сработал/не сработал, а в этом случае оно идёт уже после файра. Плюс, природа ивентов в большинстве систем подразумевает, что изменение порядка выполнения листенеров в один момент времени не должно менять поведение системы.
А без удаления может быть такая ситуация: один листенер добавляет другой, который в свою очередь добавляет третий и т.д. Например, когда каждый клик по объекту определяет, как он должен будет себя вести при следующем клике (у меня такое было). В таком случае вместо ожидаемого поведения происходит бесконечный цикл и скрипт вешается.
Кстати, лучше в fireEvent сначала собирать все listener'ы в отдельный массив, а потом уже их в цикле выполнять (как у меня в примере). А то до того, как это сделал, сталкивался со разными багами в случае, если add/removeListener выполняется внутри другого listener'а.
Например, первый листенер сам себя удаляет, на следующей итерации цикла выполняется 2-й листенер в массиве listeners[type] (который раньше был 3-м), а предыдущий из-за удаления первого пропускается совсем.
Вообще практически все джаваскриптовые фреймворки способствуют применению такой функциональности. :) Custom events есть и применяются в jQuery, Prototype, YUI, Mootools, dojo, etc.
Это одна из моих самых любимых игр! Играл в нее с перерывами много лет, но так и не смог пройти (после того, как отказался жульничать с сейвами). :) Максимальным достижением был, кажется, хай элф прист где-то 25-30 уровня. Вот вы сейчас напомнили — пожалуй, попробую опять.
Кстати, мы (украинская группа Обійми Дощу) недавно выпустили дебютный альбом — это грустный, по-осеннему лиричный прогрессив рок с элементами неоклассики (много живых струнных), можно скачать с сайта бесплатно. Можете послушать как пример того, к чему можно прийти, не имея музыкального образования — только энтузиазм и желание трудиться, не сдаваясь.
А в твоём варианте действительно очень нужна оптимизация. :) А то тут получается целых три (!) вложенных друг в друга цикла (while, один for и другой в indexOf), при чём еще с кучей промежуточных вызовов функций, что вместе очень сильно должно тормозить по сравнению с одним циклом с прямыми обращениями к массиву без вызовов, как у меня.
А без удаления может быть такая ситуация: один листенер добавляет другой, который в свою очередь добавляет третий и т.д. Например, когда каждый клик по объекту определяет, как он должен будет себя вести при следующем клике (у меня такое было). В таком случае вместо ожидаемого поведения происходит бесконечный цикл и скрипт вешается.
Например, первый листенер сам себя удаляет, на следующей итерации цикла выполняется 2-й листенер в массиве listeners[type] (который раньше был 3-м), а предыдущий из-за удаления первого пропускается совсем.
Использовать так: