Лучший подход, чтобы избежать ошибок "this" в JavaScript в XBL - PullRequest
0 голосов
/ 23 декабря 2010

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

-

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

Какой лучший способ избежать такой ошибки?

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

- обновление

Чуть большедетали:

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

Ответы [ 2 ]

1 голос
/ 07 января 2011

Как вы уже слышали, проблема в том, что параметр 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, поэтому я надеюсь, что это будет полезно.)

0 голосов
/ 07 января 2011

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

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

...