2009-06-09 8 views
2

J'ai ce morceau de code, et il ne fonctionne pas comme je l'attends (c'est le code de démonstration, distillée à partir d'un plus grand programme):Javascript littéral perd ses variables lorsqu'elle est appelée avec setTimeout

<!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> 

Lorsque je clique sur le bouton Go, à la fois dans IE et FF (les seuls navigateurs qui m'intéressent), la première case d'alerte affiche "true", la seconde "undefined". Mes questions sont pourquoi, et comment puis-je l'éviter?

Répondre

11

setTimeout exécutera la fonction passée dans le contexte de la fenêtre, ainsi 'ceci' fait référence à la fenêtre. Essayez ceci à la place:

setTimeout(function(){ 
    test.go(); 
}, 500); 
2

Il semble que "this" pointe vers autre chose lorsque vous appelez "go" à partir du timeout. il pointe probablement vers la fenêtre.

essayer quelque chose comme ça

var fn = function(){ 
    test.go.apply(test, []); 
} 
setTimetout(fn, 500); 
+0

Merci, votre réponse a été la première, mais les autres sont plus courtes, j'ai donc accepté l'une d'entre elles. – Tominator

4

changer la ligne

setTimeout(test.go, 500); 

avec

setTimeout(function(){test.go()}, 500); 

et votre script shoud fonctionnent très bien.

Questions connexes