2010-11-22 10 views
1

Je sais, je sais, n'utilise pas de variables globales. Mais je les ai utilisés pour toutes sortes de structures de contrôle au cours des années et ils fonctionnent bien pour ce type modulaire de l'époque.Problème de portée javascript avec les tableaux 'globaux'

Mon problème actuel concerne la 'disparition de la portée' des tableaux déclarés globaux, remplis plus tard et référencés ailleurs. Je fais souvent ce qui suit sur ma page html:

<...> 
<script type="text/javascript" src="./js/arrayStuff.js"></script> 
<script type="text/javascript" src="./js/printStuff.js"></script>  
<script type="text/javascript> 

var gGlobalArray = new Array(); 

loadgGlobalArray(); 
printgGlobalArray(); 

</script> 
</head> 
<html>blah blah 
</html> 

Alors je vais avoir quelque chose comme ça dans le fichier arrayStuff.js pour faire un tableau multidimensionnel dont la taille n'est pas connue à l'avance:

function loadgGlobalArray() 
{ 
<...> 
gGlobalArray[rawFileIndex] = new Array(9); 
gGlobalArray[rawFileIndex][0] = currentPathIndex; 
gGlobalArray[rawFileIndex][1] = currentCtlName; 
gGlobalArray[rawFileIndex][2] = currentStepbounds; 
<...> 

Dans le fichier printStuff, js, je peux référencer les différentes dimensions OK:

<...> 
buffer += "<td>"+gGlobalArray[i][7]+</td><td>+gGlobalArray[i][8]+</td>"; 
document.getElementByID('output').innerHTML = buffer; 
<...> 

maintenant, je travaille sur un nouveau fichier externe .js, et voici ce qui me dérange. Parfois, mes tableaux globaux de la vieille école fonctionnent comme je les ai l'intention et parfois non. Je sais que les tableaux Javascript sont vraiment des objets, et peuvent comprendre pourquoi la propriété longueur peut ne pas être disponible, par exemple, mais le pointeur est que mes tableaux se comportent comme prévu tant que je laisse mes alertes de débogage habituelles dans les fichiers externes . Si je commente toutes les alertes, les informations de tableau interne disparaissent, la propriété de longueur disparaît, etc. Si je mets une seule instruction d'alerte dans le bit où je remplis le tableau, même si l'alerte ne fait pas référence à le tableau lui-même, l'information est conservée. Pourquoi?

Répondre

2

Il n'y a aucune raison pour laquelle la longueur ne devrait pas être disponible, en supposant que vous ayez réellement défini le tableau comme vous l'avez fait. Peut-être que quelque chose d'autre se passe, comme vous le faites dans un fichier avant que l'autre fichier soit chargé, ou quelque chose. L'alerte peut provoquer une pause qui permet au chargement de se charger.

BTW, vous devriez regarder dans la notation littérale objet et tableau:

gGlobalArray[rawFileIndex] = new Array(9); 
gGlobalArray[rawFileIndex][0] = currentPathIndex; 
gGlobalArray[rawFileIndex][1] = currentCtlName; 
gGlobalArray[rawFileIndex][2] = currentStepbounds; 

pourrait être

gGlobalArray[rawFileIndex] = [ 
currentPathIndex, currentCtlName, currentStepbounds...]; 

beaucoup plus court et plus facile à regarder.

+0

yup, c'était une condition de concurrence, et l'objet n'existait pas encore au point où il était référencé. Merci pour le look et le conseil littéral! – lemo