Лучший подход, чтобы избежать ошибок javascript «this» в XBL

Говоря о XBL, вы не совсем говорите о javascript. Поэтому я создам этот вопрос, связанный с этим, но теперь о XBL, где я не являюсь создателем корневого кода javascript, а просто методов и обработчиков событий внутри привязок.

--

В некоторых случаях ключевое слово this может не относиться к ожидаемому объекту. (недавний пример: в ключевом событии в моем XBL)

Каков наилучший подход, чтобы избежать такой ошибки?

На данный момент я всегда использую getElementById (или $.fn из jQuery), но я не уверен, что это лучший подход.

--обновить

Немного подробнее:

В рамках метода XBL единственный способ получить доступ к элементу, определенному в Xul (файл описания GUI) без использования "this" (поскольку это может быть не «это», я ожидаю) с getElementById, и это делает код не пригодным для повторного использования, поэтому я ищу альтернативы.


person The Student    schedule 23.12.2010    source источник


Ответы (2)


Как вы уже слышали, проблема в том, что параметр this не обязательно является тем объектом, о котором вы подумали в первую очередь, особенно когда вы говорите об обработчиках событий и тому подобном. Лучший способ, который я нашел, — это написать небольшую функцию, которая будет связывать некоторый объект как переменную this и возвращать другую функцию, которая использует привязку для вызова исходной функции.

Взгляните на этот код:

var bindFunction = function(self, f) {
  return function() {
    return f.apply(self);
  };
};

var foo = function() {
  alert(this.hello);
};

var bar = { 
  hello: "Hello there"
};

var boundFoo = bindFunction(bar, foo);
boundFoo();

У меня есть функция с именем bindFunction, которая принимает объект (с именем self) и некоторую функцию и возвращает другую функцию, которая будет вызывать переданную функцию, применяя объект self в качестве переменной this.

Остальная часть кода представляет собой просто тестовый код: функция foo, которая будет оповещать this.hello, объект bar с членом hello и то, как вы можете связать foo с bar.

По сути, я взял функцию, не принимающую никаких параметров, и сгенерировал другую функцию, которая гарантирует, что первая всегда вызывается с правильной переменной this. Идеально подходит для обработчиков событий.

(Извините, но я ничего не знаю о XBL, поэтому надеюсь, что это будет полезно.)

person jmbucknall    schedule 06.01.2011
comment
bind построен на EcmaScript 5, а новый режим strict быстро устраняет многие this проблемы. - person Mike Samuel; 07.01.2011
comment
Спасибо за ответ, в вашем примере у вас есть панель, которую можно использовать как самого себя, но внутри XBL метод единственный способ получить доступ к элементу, определенному в файле Xul ( файл описания графического интерфейса) с getElementById, и это делает код не пригодным для повторного использования, поэтому я ищу альтернативы. - person The Student; 07.01.2011
comment
Вместо того, чтобы писать otherDoc.addEventListener(event, this.myMethod, false); теперь вы пишете otherDoc.addEventListener(event, this.bindFunction(this, this.myMethod), false); - person Neil; 11.01.2011
comment
Теперь я обнаружил, что могу использовать такие подходы, как var self = this и addEventListener("event", function() { self.myMethod() }, false). - person The Student; 11.01.2011

Если нет лучшего ответа, хорошим подходом может быть использование файлов javascript вместо XBL для реализации. Глядя на исходный код Xulrunner, похоже, что большинство кода делает это.

Но я все равно хотел бы использовать XBL, если бы был способ нормально с ним работать.

person The Student    schedule 07.01.2011