Ответ 1
Если вам нужна функция со значением this
, привязанным к определенному объекту. Например, в обратных вызовах, таких как обработчики событий, обратные вызовы AJAX, тайм-ауты, интервалы, пользовательские объекты и т.д.
Это просто продуманный пример ситуации, когда это может быть полезно. Предполагая, что существует объект Person
, который имеет имя свойства. Он также связан с элементом ввода текста, и всякий раз, когда изменяется входное значение, также изменяется имя в этом объекте person.
function Person(el) {
this.name = '';
$(el).change(function(event) {
// Want to update this.name of the Person object,
// but can't because this here refers to the element
// that triggered the change event.
});
}
Одним из решений, которое мы часто используем, является сохранение этого контекста в переменной и использование внутри функции обратного вызова, например:
function Person(el) {
this.name = '';
var self = this; // store reference to this
$(el).change(function(event) {
self.name = this.value; // captures self in a closure
});
}
В качестве альтернативы мы могли бы использовать jQuery.proxy
здесь, поэтому ссылка на this
ссылается на объект Person вместо элемента, вызвавшего событие.
function Person(el) {
this.name = '';
$(el).change(jQuery.proxy(function(event) {
this.name = event.target.value;
}, this));
}
Обратите внимание, что эта функция стандартизована в ECMAScript 5, которая теперь включает метод bind
, заимствованный из prototypejs и уже доступен в некоторых браузерах.
function Person(el) {
this.name = '';
$(el).change(function(event) {
this.name = event.target.value;
}.bind(this)); // we're binding the function to the object of person
}