Verwendung von jQuery.proxy ()

68

Ich habe die API gelesen jQuery.proxy(). Es sieht vielversprechend aus, aber ich habe mich gefragt, in welcher Situation diese Verwendung am besten ist. Kann mich jemand aufklären?

Reigel
quelle
Siehe auch stackoverflow.com/a/4986562 für eine gute Erklärung
Paul

Antworten:

139

When you want a function that has the this value bound to a specific object. For example, in callbacks such as event handlers, AJAX callbacks, timeouts, intervals, custom objects, etc.

Dies ist nur ein Beispiel für eine Situation, in der dies nützlich sein könnte. Vorausgesetzt, es gibt einePerson object which has a property name. It is also linked to a text input element, and whenever the input value changes, the name in this person object gets updated too.

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.
    });
}

Eine häufig verwendete Lösung besteht darin, diesen Kontext in einer Variablen zu speichern und diese in der Rückruffunktion zu verwenden, z.

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
    });
}

Alternativ hätten wir jQuery.proxyhier auch den Verweis thisauf das Objekt der Person anstelle des Elements verwenden können, das das Ereignis ausgelöst hat.

function Person(el) {
    this.name = '';

    $(el).change(jQuery.proxy(function(event) {
        this.name = event.target.value;
    }, this));
}

Beachten Sie, dass diese Funktion in ECMAScript 5 standardisiert wurde, das jetzt das enthält bind entliehene Methode und ist in einigen Browsern bereits verfügbar.

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
}
Anurag
quelle
34
+1 für die Erwähnung, dass dies seinen Weg in ECMAscript gefunden hat.
Mike Sherov
1
Ist es besser (schneller, effizienter), einen regulären Abschluss oder $ .proxy zu verwenden?
Anson MacKeracher
4
@AnsonMacKeracher Es ist besser und schneller, überhaupt keinen Verschluss zu verwenden, sondern eine statische Proxy-Funktion. Diese Antworten zeigen nicht, dass Proxy mit statischen Funktionen self = thisverwendet werden kann, da der Hack nur verwendet werden kann, wenn Sie die Funktion inline erstellen
Esailija
3
Um noch einen Schritt weiter zu gehen, sind in ECMAScript 6 (ES6) Pfeilfunktionen der richtige Weg ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) `function Person (el) {this. name = ''; $ (el) .change ((event) => {this.name = event.target.value;}); } `
TypingTurtle
17

Dies ist nur eine Kurzmethode zum Festlegen des Kontexts für einen Abschluss, zum Beispiel:

$(".myClass").click(function() {
  setTimeout(function() {
    alert(this); //window
  }, 1000);
});

Wie oft wir auch thisbleiben wollen , wir wollen die Methode bleiben, für die wir verwendet wurden $.proxy():

$("button").click(function() {
  setTimeout($.proxy(function() {
    alert(this); //button
  }, this), 1000);
});​

Es wird normalerweise für verspätete Anrufe oder überall dort verwendet, wo Sie keine Langstreckenmethode zum Deklarieren einer Schließung durchführen möchten. Die Zeichenfolgenmethode zum Verweisen des Kontexts auf ein Objekt ... Nun, ich habe noch keine praktische Verwendung im täglichen Code gefunden, aber ich bin sicher, dass es Anwendungen gibt, hängt nur davon ab, wie Ihre Objekt- / Ereignisstruktur aussieht.

Nick Craver
quelle
14

Zum Beispiel, wenn Sie Rückrufe erstellen möchten. Anstatt von:

var that = this;

$('button').click(function() {
    that.someMethod();
});

du kannst tun:

$('button').click($.proxy(this.someMethod, this));

Oder wenn Sie ein Plugin erstellen, das Rückrufe akzeptiert und einen bestimmten Kontext für den Rückruf festlegen müssen.

Felix Kling
quelle