Это общая проблема при использовании методов экземпляра в качестве обратных вызовов в JavaScript. Я использую эту функцию, чтобы создать оболочку для вызова метода, связанного с правильной, например:
function bound_method(instance, method) {
return function() {
return method.apply(instance, arguments);
};
}
Затем вы можете использовать это в качестве обратного вызова вместо this.foo:
bound_method(this, this.foo)
В отличие от некоторых другие предложения, это позволяет вам ставить методы на прототипе, а не создавать их в конструкторе. Таким образом, у вас есть только одна общая копия реализации вместо повторного создания этих функций для каждого нового экземпляра панели.
var bar = function() {};
$.extend(bar, {
baz: function() {
this.input = $('.input');
this.input.bind("keydown keyup focus blur change",
bound_method(this, this.foo));
},
foo: function(event) {
console.log(this);
}
});
Я бы добавил, что вам действительно не нужна часть «var bar =». Чтобы вызвать замыкание в строке, добавьте «()» перед последней точкой с запятой. – spoulson
Да, но обратите внимание также, что если закрытие выполняется автоматически, 'baz' и' foo' станут глобальными, так как 'this' будет объектом window. – CMS
Спасибо, я думаю, я поеду с этим вариантом «внешнего закрытия». Но я надеялся на что-то большее, ну, элегантное, вроде a, dunno, second bind внутри input.bind(). У меня такое чувство, что я где-то видел что-то подобное. Есть ли другие варианты? – n1313