Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 13.07.2008, 02:08
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Да нет, я не считаю это цеплянием к словам :-) спасибо, что поправили, теперь вижу разницу между абстрактной и анонимной функциями.

Отделил функции созданные при помощи declaration и statement от анонимных регулярным выражением:
obj.attachEvent('on' + type, listener.toString().search(/^function\s*\(/) + 1 ? listener.bind(obj) : listener);

для этого в прототипе bind возвращаем не анонимную функцию
Function.prototype.bind = function(object) {
  var __method = this;
  return function __fn() {
    return __method.apply(object, arguments);
}

в итоге получается, что если в метод объекта bind передаем анонимную функцию, то выполняется автоматическая обертка, чтобы по ссылке this был доступен этот объект, иначе, если хотим использовать detachEvent передаем в метод объекта bind имя функции или переменную, содержащую функцию, если хотим еще использовать и detachEvent и this, то перед передачей в метод bind, выполняем еще var handler = fn.bind(obj);
Страсти короче, но работает %)
Как то в jQuery это все автоматически делается

Последний раз редактировалось Octane, 13.07.2008 в 03:08.
Ответить с цитированием
  #12 (permalink)  
Старый 13.07.2008, 13:02
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Octane
Как то в jQuery это все автоматически делается
значит нужно запоминать хэндрелы в каком-нибудь хранилище и при unbind'e получать их и делать detachEvent (самому хэндлеру тоже какой-то признак надо ставить, поскольку аттачиться для IE будет не он, а новая функция, полученная посредством apply'я - т.е. надо устроить однозначное соответствие между приходящим хэндлером и тем, который был навешан). За подобную автоматизацию придется платить ресурсами (что jQuery и делает - во всяком случае в этом конкретном случае).

P.S.:

Сообщение от Octane
declaration и statement
Еще один момент - функция не обязательно является declaration, если имеет имя (в вашем случае - return function __fn() { ... ) - т.к. функция стоит справа от return, - она является statement'ом =).
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 13.07.2008 в 14:02.
Ответить с цитированием
  #13 (permalink)  
Старый 13.07.2008, 16:16
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Наверное остановлюсь на таком варианте, т.к. detachEvent используется редко.
Ответить с цитированием
  #14 (permalink)  
Старый 23.07.2008, 17:37
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Большой постскриптум: (не касающийся темы, просто чтобы исправить мою терминологическую путаницу, которая фигурировала в этом конкретном топике): "все вхождения "function-statement" читать (естественно, и согласно терминологии ECMAScript) как function-expression"
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 23.07.2008 в 18:15.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодировка при использовании Ajax Nichloas AJAX и COMET 9 17.09.2009 16:06