Javascript callbacks verlieren 'diese'
Ich einen Aussteller, wo verliere ich das 'das' in diesem 'Objekt'. Die Ausgabe des folgenden javascript-Code gibt mir "einige-id" und dann "undefined". Wenn ich "this" innerhalb einer callback-Funktion, der Anwendungsbereich geht von der Objekt-und es nicht verwenden können, 'dieses' mehr. Wie bekomme ich den Rückruf für die Verwendung von 'dies' oder zumindest Zugriff auf das Objekt?
Da ich mehrere Gegenstände, die ich nicht in der Lage, erstellen Sie eine 'statische' wie Lagerung. Bitte helfen Sie dieses javascript n00b 😉
hier ist mein test-code, den Sie verwenden können, um zu reproduzieren mein problem. Was ich möchte ist CheckBox.doSomething()
um den Rückgabewert von this.id
die sollten übereinstimmen some-id
für diesen Testfall.
function CheckBox(input_id) {
this.id = input_id;
this.doSomething();
$('#some-element').click(this.doSomething);
}
Checkbox.prototype.doSomething = function() {
alert(this.input_id);
}
var some_box = new CheckBox('some-id');
some_box.doSomething();
$('#some-element').click();
edit: ich kann noch nicht mal das funktioniert, wie ich es will:
function CheckBox2(input_id) {
this.id = input_id;
alert(this.id);
}
CheckBox2.prototype.doSomething = function() {
alert(this.input_id);
}
var some_box = new CheckBox2('some-id');
some_box.doSomething();
- möglich, Duplikat der scope-of-this-in-javascript
- diese Technik ist nur für dynamisch erzeugte Funktionen, nicht jene, die im Prototyp.
- möglich, Duplikat der jQuery/javascript-Ereignisse - Prototyp-event-handler
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den "javascript-äquivalent" dieser ist
Function#bind
aber das ist nicht in jeder browser-und da es scheint, Sie sind mit jQuery bin ich über das jQuery-äquivalent$.proxy
Dein problem mit dieser Zeile:
$('#some-element').click(this.doSomething);
, Warum dies ein problem
JavaScript-Methoden, die nicht wissen, etwas über das Objekt, das zugewiesen werden soll
this
, es ist festgelegt, wenn die Methode aufgerufen wird, entweder explizit (mitmyFunction.call(obj)
) oder implizit (wenn man mitobj.myFunction()
).Beispiel:
In Ihrem Fall, Sie sind vorbei
this.doSomething
zu jQuery, die dann explizit aufrufen, es mit dem element, auf das geklickt wurde, als der Wertthis
. Was passiert ist (eine etwas komplexere version) dieses:Die Lösung
Müssen Sie sicherstellen, dass
doSomething
heißt mit dem richtigen Wertthis
. Sie können tun, dass durch das einwickeln von es in eine andere Funktion:jQuery bietet eine
proxy
- Funktion können Sie dies einfach:some_box.doSomething();
ist schon bei mir, 'undefined', wenn ich es nennen.. Wie ist das möglich? Ich bin nicht mit jedem Rückrufe gibtthis.id
aber in derdoSomething
Funktion, Sie verweisenthis.input_id
this.func = $.proxy(this.func, this)
dann sollten Sie wirklich verstehen, wie und warum es funktioniert, dessen bin ich mir sicher, dass Sie tun, aber andere Lesen deine Antwort nicht.Andere haben bereits erklärt, die Ursachen des Problems und wie es zu beheben mit jQuery. Was übrig bleibt, ist, wie man das lösen mit standard-JavaScript. Statt ...
... Sie schreiben:
Dadurch ändert sich der Kontext der
this
innendoSomething
. Sie können auch tun, dass mit anonymen Funktionen - statt ...... Sie schreiben:
Wurde sehr nützlich für mich in Projekte mit vielen Rückrufe, z.B. in Node.js (wo Sie nicht zu kümmern, veraltete Browser).
Edit:
getElementById()
undaddEventListener()
statt$(...).click(...)
.