Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Ссылка на объект при использовании attachEvent (https://javascript.ru/forum/events/1395-ssylka-na-obekt-pri-ispolzovanii-attachevent.html)

Octane 13.07.2008 02:08

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

Отделил функции созданные при помощи 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 это все автоматически делается :-/

Dmitry A. Soshnikov 13.07.2008 13:02

Цитата:

Сообщение от Octane
Как то в jQuery это все автоматически делается :-/

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

P.S.:

Цитата:

Сообщение от Octane
declaration и statement

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

Octane 13.07.2008 16:16

Наверное остановлюсь на таком варианте, т.к. detachEvent используется редко.

Dmitry A. Soshnikov 23.07.2008 17:37

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


Часовой пояс GMT +3, время: 19:04.