JQuery: как получить доступ к родительской функции "this" изнутри анонимной функции?
...
$.fn.annotateEdit = function(image, note) {
if (note) {
this.note = note;
} else {
var newNote = new Object();
newNote.id = "new";
this.note = newNote;
}
}
...
var mynote = this.note;
form.find(':radio').change(function() {
var vacancy = $(this).attr('value');
mynote.vacancy = vacancy;
});
...
Можно ли получить доступ к этой "заметке" из обработчика change() без определения "mynote"?
Ответы
Ответ 1
Я использую шаблон, подобный этому, поэтому я могу получить доступ к чему-либо в охватывающей области:
var that = this;
...
form.find(':radio').change(function () {
that.note.vacancy = $(this).attr('value');
});
Я поклонник этого шаблона, потому что он делает код более читаемым. На мой взгляд, ясно, что доступ к нему является частью охватывающей области (пока использование that
непротиворечиво).
Ответ 2
Используйте $.proxy
, чтобы привязать его к функции...
// Returns a function-------v
form.find(':radio').change( $.proxy(function() {
var vacancy = $(this).attr('value');
mynote.vacancy = vacancy;
}, this) );
// ^---- ...that has its "this" value set as this argument.
Ответ 3
Для него нет выделенного языкового механизма. Общая схема заключается в сохранении this
в локальной (замыкающей) переменной (часто называемой self
или that
) внешней функции:
var self = this;
var innerFunction = function() {
self.x = 1;
};
Ответ 4
Отметьте это: http://api.jquery.com/bind/ и "Передача данных событий"
Вы можете сделать что-то вроде этого:
form.find(':radio').bind("change", {
context : this
}, function(event){
console.log(event.data.context);
console.log(event.data.context.note);
});
Ответ 5
Вы можете связать контекст родительского объекта таким образом.
form.find(':radio').change(function(that) {
var vacancy = $(this).attr('value');
that.note.vacancy = vacancy;
}.bind(null,this));