Umfang in einem $.ajax-callback-Funktion
Wenn ich mit diesem code, warum hat sich der Rahmen geändert für die "doStuff" - Alarm? Gibt es eine Möglichkeit, dass ich sicherstellen kann, dass der Geltungsbereich ist meine Sache und nicht das Window-Objekt?
Hier ist der gleiche code in jsfiddle.
(function ($) {
var c$ = {};
c$.TestScope = function () {
this.doAjax = function (onComplete) {
var self = this;
$.ajax({
url: 'badurl',
complete: function (data) {
alert('doAjax2 self === c$.oTestScope: ' + (self === c$.oTestScope).toString());
onComplete(data);
}
});
alert('doAjax1 self === c$.oTestScope: ' + (self === c$.oTestScope).toString());
};
this.doStuff = function (data) {
var self = this;
alert('doStuff self === c$.oTestScope: ' + (self === c$.oTestScope).toString());
}
};
c$.oTestScope = new c$.TestScope();
c$.oTestScope.doAjax(c$.oTestScope.doStuff);
})(jQuery);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie in der Lage sein, um anzugeben, die
this
Wert, wie der Kontext, in Ihrer$.ajax()
Parameter:Bearbeiten machte ich einen fiddle für diese und überprüft, dass es richtig funktioniert. Es gibt kein Gefummel mit extra
self
parameter oder mit dreck um sich mit Verschlüssen halten Sie Ihre Variablen.Teil von dem was Sie fehlte, war eine Berufung
onComplete.call(this, data)
aufrufendoStuff()
.this
ohne zusätzliche Verschlüsse oder temporäre Variablen.onComplete
Rückruf. Es ruftdoStuff
direkt. Wenn Sie ändernthis.doStuff(data)
zuonComplete(data)
,(this === c$.oTestScope)
false zurück. Ich bin damit einverstanden, dass Ihre syntax ist viel sauberer. Wenn ich kann, dass es funktioniert werde ich es nutzen.onComplete.call(this, data);
das ist das gleiche wiethis.doStuff()
, außer dass Sie verwenden können, die übergebene Funktion egal, was es ist.onComplete.call()
Habe ich verändert den code übergeben Sie einen Verweis auf
this
auf der doStuff () - code.