2008-11-27 12 views
9

J'ai problème avec le javascript suivant -l'accès à des variables globales dans un rappel

var bVisited = false; 

function aFuncCallBack(somestring) 
{ 
    bVisited = true; 
} 

processingManager.setCallBack(aFuncCallBack); 
processingManager.DoWork(); 

if(bvisited == false) 
    alert("Call back not entered"); 

aFuncCallBack obtient coups dans mon cas; Je mets le bVisited à true là - mais toujours quand je vérifie la variable après l'appel DoWork la valeur est toujours false - Je ne peux pas figurer quel est le problème. J'ai cherché des discussions mais je n'ai rien trouvé de pertinent.

Quelqu'un pourrait-il jeter un peu de lumière sur les raisons de ce comportement et peut-être que dois-je faire?

Répondre

12

Le rappel fonctionne de manière asynchrone? Essayez d'ajouter un alert() dans le rappel et voir si elle se déclenche avant votre alerte existante.

S'il y a quelque chose de portée bizarre se passe (ne devrait pas être, mais vous ne savez jamais), vous pouvez accéder à GLOBALS en utilisant l'objet de la fenêtre: window.bVisited = true;

Edit: Vous vérifiez bvisited == false au lieu de bVisited == false - espérons-ce est une faute de frappe dans votre question et pas dans le code!

4

Si processingManager.DoWork(); est asynchrone, il est possible qu'il puisse revenir avant bVisited a été fixé.

Aussi, vous avez visité votre test, pas bVisited - est-ce une pâte & couper à partir de votre code?

0

Comme les autres l'ont souligné, JavaScript est sensible à la casse, et les variables non déclarées sont indéfinies, c'est-à-dire. 0/false/null par défaut.
Un Gotcha commun avec les langages dynamiques sans quelque chose comme use strict/option explicit ou directives similaires ...

0

désolé, sa fait une faute de frappe sur bvisited - et ma question était vraiment sur le stockage des états -

i type de compris le problème pour moi après que je posté cette question - le problème est dû à l'appel asynchrone -

comme quelqu'un a fait remarquer -

> Si processingManager.DoWork(); est asynchrone, il est possible qu'il puisse revenir avant que bVisited ait été défini. >

oui, processingManager.DoWork est un appel asynchrone - et mes js est en cours d'exécution à la fin avant bvisited est définie sur true par un rappel -

- que crée un doute en moi - sont variables globales visibles dans tous les fichiers js? sens que dire, comme une partie de mon exécution, j'ai deux fichiers js -

1.js
// CODE bVarGlobal1 = true // CODE

premier 1.js est exécuté puis 2 .js sera traité

Ici, est-ce que 2.js peut accéder à la variable bVarGlobal1 de n'importe quelle façon? (avons-nous besoin de préfixer un type de mot-clé "export" à la variable bVarGlobal1 dans le 1.js afin que la variable soit visible tout au long de la durée de vie du programme?)

PS: je viens de C/C++ fond et nouveau à javascript alors pardonnez-moi sur le mot-clé "export" si une telle chose n'existe pas dans JS :)

+0

Vous pouvez poser cette question comme une question distincte, mais la réponse courte est oui, tout dans le fichier 1 sera visible dans le fichier 2. – Benry

Questions connexes