jQuery: Wie greife ich von der anonymen Funktion aus auf die übergeordnete Funktion “this” zu?

Lesezeit: 2 Minuten
...
$.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;
});
...

Ist es möglich, vom change()-Handler aus auf „this.note“ zuzugreifen, ohne „mynote“ zu definieren?

  • Danke für all die superschnellen und genauen Antworten. Ich kann nur eine als Antwort auswählen, also nehme ich das einfachste – das “dass” -Muster. Aber die anderen sind definitiv nicht weniger wertvoll.

    – lkraav

    5. Februar 2012 um 16:18 Uhr

Benutzer-Avatar
Alec Schlucht

Ich verwende ein Muster wie dieses, damit ich auf alles im umschließenden Bereich zugreifen kann:

var that = this;
...

form.find(':radio').change(function () {
    that.note.vacancy = $(this).attr('value');
});

Ich bin ein Fan dieses Musters, weil es den Code etwas besser lesbar macht. Meiner Meinung nach ist klar, worauf zugegriffen wird, was Teil des umschließenden Bereichs ist (solange die Verwendung von that ist konsistent).

  • Ich habe dieses Muster schon ein paar Mal gesehen, aber es ähnelt seinem mynote Definition, nein?

    – Gideon

    5. Februar 2012 um 16:11 Uhr

  • Ähnlich, aber nicht ganz, var mynote = this.note beschränkt ihn darauf, nur die zu verwenden note Variable, aber meine Methode lässt ihn auf alles im Gültigkeitsbereich zugreifen. Es macht den Code ein wenig lesbarer, da klar ist, worauf zugegriffen wird (solange Sie mit der Verwendung von konsistent sind that).

    – Alec-Schlucht

    5. Februar 2012 um 16:13 Uhr


  • Stimmt, ja, ich denke, das ist der Grund, warum ich das an vielen Stellen im JS-Code sehe 🙂

    – Gideon

    5. Februar 2012 um 16:15 Uhr


Verwenden $.proxy um es an eine Funktion zu binden …

   // 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.

  • Ich sehe die Verwendung von $.proxy als elegantere Lösung, möchte aber verstehen: Ist diese bessere Lösung als die, die als Antwort akzeptiert wurde oder nicht? was ist der Unterschied?

    – Schaunak

    22. Januar 2013 um 4:29 Uhr

Es gibt keinen dedizierten Sprachmechanismus dafür. Das übliche Muster ist die Speicherung der this in lokaler (Abschluss-)Variable (oft benannt self oder that) der äußeren Funktion:

var self = this;
var innerFunction = function() {
    self.x = 1;
};

Überprüfen Sie dies – http://api.jquery.com/bind/ und “Ereignisdaten übergeben” Sie können so etwas tun:

form.find(':radio').bind("change", {
context : this
}, function(event){
    console.log(event.data.context);
    console.log(event.data.context.note);
});

Sie können den Kontext des übergeordneten Objekts so binden.

form.find(':radio').change(function(that) {
    var vacancy = $(this).attr('value');
    that.note.vacancy = vacancy;
}.bind(null,this));

1083350cookie-checkjQuery: Wie greife ich von der anonymen Funktion aus auf die übergeordnete Funktion “this” zu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy