Подтвердить что ты не робот

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"?

4b9b3361

Ответ 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));