Javascript wörtlichen verliert seine Variablen, wenn mit setTimeout genannt
-
13-09-2019 - |
Frage
ich dieses Stück Code, und es funktioniert nicht, wie ich erwarte, dass (es ist Demo-Code, von einem größeren Programm destilliert):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Test</title>
<script language="javascript" type="text/javascript">
var test = {
variable: true,
go: function() {
alert(this.variable);
}
};
function s() {
test.go();
setTimeout(test.go, 500);
}
</script>
</head>
<body>
<form action="#">
<input type="button" value="Go" onclick="s();" />
</form>
</body>
</html>
Wenn ich die Go-Taste klicken, sowohl im IE und FF (der einzige Browser Ich kümmere mich um atm), das erste Warnfeld zeigt „true“, die zweiten „undefiniert“.
Meine Fragen sind, warum, und wie kann ich es vermeiden?
Lösung
setTimeout
wird die übergebene Funktion im Rahmen des Fensters auszuführen, so ‚this‘ bezieht sich auf das Fenster. Versuchen Sie stattdessen:
setTimeout(function(){
test.go();
}, 500);
Andere Tipps
die Zeile
setTimeout(test.go, 500);
mit
setTimeout(function(){test.go()}, 500);
und Ihr Skript shoud funktionieren.
Es sieht aus wie „this“ verweist auf etwas anderes, wenn Sie „gehen“ aus dem Timeout aufrufen. es weist wahrscheinlich auf Fenster.
versuchen, so etwas wie diese
var fn = function(){
test.go.apply(test, []);
}
setTimetout(fn, 500);