SetTimeout-Bereichsproblem
Habe ich ein setTimeout definiert, die innerhalb einer Funktion steuert der Spieler respawnen (ich bin ein Spiel zu schaffen):
var player = {
...
death:(function() {
this.alive = false;
Console.log("death!");
var timer3 = setTimeout((function() {
this.alive = true;
Console.log("alive!");
}),3000);
}),
...
}
Wenn es ausgeführt wird, lese ich in der console", " Tod!" und 3 Sekunden später "alive!". Allerdings alive
ist nie wirklich true zurück, denn wenn ich Schreibe player.alive
in der Konsole, es gibt false
. Wie kommt es, dass ich sehen kann, "lebt!", aber die variable wird nie wieder auf true?
InformationsquelleAutor der Frage Polyov | 2012-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie vorsichtig sein, mit
this
. Weisen Sie Ihrethis
im äußeren Gültigkeitsbereich einer variable. Diethis
Stichwort immer bezieht sich auf diethis
des aktuellen Bereichs, die änderungen jedes mal, wenn Sie wickeln Sie etwas infunction() { ... }
.Dies sollte Ihnen einen besseren Erfolg.
InformationsquelleAutor der Antwort zostay
Weil
this
imsetTimeout
- handler bezieht sich aufwindow
auf, welche vermutlich nicht den gleichen Wert wie verwiesen durchthis
außerhalb der Prozedur.Können Sie cache der äußere Wert, und verwenden Sie es im inneren...
...oder Sie verwenden können, ES5
Function.prototype.bind
......obwohl, wenn Sie die Unterstützung von legacy-Implementierungen, müssen Sie hinzufügen einen shim zu
Function.prototype
.Funktion.der Prototyp.bind
patch...oder wenn Sie arbeiten in einem ES6 Umgebung...
Weil es keine Bindung von
this
inPfeil-Funktionen
.InformationsquelleAutor der Antwort
Nur falls jemand dies liest, der neuen javascript-syntax können Sie binden einen Bereich, eine Funktion mit "binden":
InformationsquelleAutor der Antwort Kokodoko
Wahrscheinlich, weil
this
ist nicht erhalten in der timeout-callback. Versuchen:Update (2017) - oder verwenden Sie eine lambda-Funktion, die implizit erfassen
this
:InformationsquelleAutor der Antwort James McLaughlin
Mit ES6-Funktion, syntax, Rahmen für 'das' ändert sich nicht innerhalb setTimeout:
InformationsquelleAutor der Antwort Samantha Guergenenov