2010-07-24 4 views
5

ceci est mon premier post, mais je suis heureux de rejoindre cette communauté. J'ai une question concernant JavaScript dont je suis complètement déconcerté. Je suis en train d'écrire une application JavaScript qui extrait les données d'un serveur en utilisant ajax et l'ajoute à un graphique. J'utilise Jquery et Highcharts comme framework, puis j'écris mon propre 'wrapper' JavaScript autour de Highcharts pour produire l'interface. Lorsque la fonction processData est rappelée avec la réponse jSON, elle commence par i = 1, même si je ne devrais même pas être initialisée ou même déclarée. D'autres variables sont également définies. (Je sais cela en utilisant des outils de développement de chrome pour déboguer). Cela rend ma boucle non exécutable et aucune de mes données n'est ajoutée au graphique.La méthode JavaScript commence w/variables assignées ?? très confus

Je ne sais pas combien de code afficher, mais ce sont les parties les plus pertinentes. Je peux en ajouter d'autres si nécessaire.

function getData(series, min, max, numpts) { 
     if (series === undefined) { 
      console.log("error on getData"); 
      return; 
     } 

     var request = {}; 
     request.series = series; 

     if (min !== undefined) { 
      request.start = min; 
     } //in seconds 
     if (max !== undefined) { 
      request.end = max; 
     } 
     if (numpts !== undefined) { 
      request.numpts = numpts; 
     } 
     $.getJSON('/data', request, processData); 
     return; 
    } 

    function processData(data) { 
     // handle the data after it comes back from an ajax request 
     var curSeries, 
      chartSeries, 
      curPoint; 

     for (var i = 0; i < data.length; i ++) { 
      curSeries = data[i]; 
      chartSeries = chart.get(curSeries.name); 

      if (chartSeries === null) { 
       //alert("oops"); 
       chart.addSeries(curSeries); 
      } else { 
       for (var j = 0; j < curSeries.data.length; j ++) { 
        curPoint = curSeries.data[j]; 
        chartSeries.addPoint(curPoint, false); 
       } 
      } 
     } 
     chart.redraw(); 
    } 

Ce sont les deux méthodes d'un graphe appelé appelé classe I.

Merci si quelqu'un a des idées! -Matt P

+4

'i' ne commencera jamais en tant que 1. La seule façon dont votre boucle ne s'exécutera pas est si data.length == 0. Faites' alert (data.length) 'en haut de' processData' et vérifiez. – Matt

Répondre

2

Je console inspectent vos données objet pour vous assurer qu'il est ce que vous attendez, comme cette boucle devrait fonctionner très bien même si je est pré-déclaré: vous attribuer 0 à elle au début de la boucle, de toute façon.

La seule raison pour laquelle je peux penser que i serait défini et initialisé avant que vous avez défini et initialisés est si ailleurs dans votre base de code que vous n'initialisez pas le i avec le mot-clé var. Ce faisant, vous le déverseriez dans la portée globale (objet de la fenêtre), ce qui le rendrait disponible via la fermeture de n'importe quelle fonction de votre base de code.

Si ce n'est pas dans l'un de vos fichiers, il se peut que ce soit dans la bibliothèque de graphes haute performance (dans ce cas, exécutez très rapidement loin de cette bibliothèque).

+0

Il est également possible que la bibliothèque jQuery faille la variable dans la portée globale, bien qu'elle soit généralement assez étendue. Quoi qu'il en soit, comme vous l'avez dit, cela ne devrait pas avoir d'importance. Javascript a vécu avec beaucoup de variables globales pendant des décennies, c'est seulement récemment que la connaissance de la portée a été largement répandue. – Guffa

+0

J'ai donc utilisé le débogueur de chromes, et comment je savais qu'il était déjà initialisé ... Cependant, j'ai couru mon code à travers jslint et ai nettoyé quelques trucs, surtout des espacements et des choses manquantes; et tout d'un coup il a cessé de faire ça ... Je ne sais pas pourquoi parce que rien n'a vraiment changé près de cette fonction. Je pense aussi que cela a peut-être été un problème de chrome. J'avais fonctionné dans le même onglet pendant un certain temps avant cela, je peux avoir juste corrompu la console en quelque sorte. :( – MattyP

Questions connexes