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