Frage

Ich habe so etwas wie folgt aus:

var Something = function(){
  this.render = function(){};
  $(window).resize(function(){
    this.render();
  });
}

Das Problem ist, dass in der anonymen Funktion ‚this‘ auf das Fenster-Objekt verweist. Ich weiß, ich könnte so etwas wie:

var Something = function(){
  this.render = function(){};
  var tempThis = this;
  $(window).resize(function(){
    tempThis.render();
  });
}

aber gibt es einen besseren Weg? Das sieht nicht sehr elegant.

War es hilfreich?

Lösung

Die Lösung gefunden Sie ist die am meisten Leute benutzen. Die gemeinsame Konvention ist Ihre tempThis Variable „das.“ Aufrufen

var Something = function(){
  this.render = function(){};
  var that = this;
  $(window).resize(function(){
    that.render();
  });
};

Andere Tipps

Das sieht aus wie die beste Wahl, ich glaube nicht, dass es ein besserer Weg. (Jemand meine korrigieren, wenn ich falsch liege).

Zu Ihrer Information die Fähigkeit, dies zu steuern, ist in der nächste Version von JQuery

Ich habe in vielen engen Situationen es auf diese Weise zu tun. Es sieht nicht elegant, aber es nie versagt. Eigentlich das ist Javascript Schließungen in Aktion.

JRH

Das ist genau das, was ich tue. Es ist nicht spezifisch für jQuery, auch nicht.

var Construct = function() {
    var self = this; //preserve scope

    this.materials = 2000;

    this.build = function(){
        self.materials -= 100;
    };
};

Denken Sie daran, das Schlüsselwort var vor Ihrem neuen Bereich Variable zu verwenden. Ansonsten sind Sie eine neue globale Variable zu schaffen. Als lokaler Variable, wird es noch innerhalb der inneren Funktion über einen Verschluss zugänglich sein.

Die beste Lösung zu halten Variablen auf ein Minimum wäre, die Function.prototype.bind () -Methode zu verwenden.

var Something = function(){
  this.render = function(){};
  $(window).resize( this.render.bind( this ) );
}

Das Problem bei dieser Methode, die zukünftige Komplikationen verursachen kann, was bedeutet, sollten Sie es wählen, sparsam zu verwenden, ist, wenn Sie $(this) aufrufen müssen, das Element zu greifen. Also, ich könnte darauf hindeuten, dass es sich lohnen würde Function.prototype.bind() in Ihrem Resize-Methode zu verwenden, aber es wäre keine gute Lösung verwenden, um es in einem Klick-Funktion sein, dass Sie vielleicht das klickten Element zum Ziel müssen direkt an.

Sehen Sie diese JSFiddle für ein funktionierendes Beispiel.

Sehen Sie die Mozilla Dokumentation auf Function.prototype .bind () für weitere Informationen

Die anderen Verfahren sind verwendbar, sondern eine Variable zu schaffen den Kontext dieser ist die unerwünschte Wirkung entsprechend Ihre Frage zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top