2013-10-02 2 views
0

Voici le code, quand je l'exécute il va en boucle infinie, des failles dans le code?Le code JS s'exécute en boucle infinie

function s4() { 
    return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); 
}; 

function guid() { 
    return [s4(), s4(), '-' , s4(), '-', s4(), '-', s4(), '-', s4(), s4(), s4()].join(''); 
} 
function randomFromInterval(from,to){ 
    return Math.floor(Math.random()*(to-from+1)+from); 
} 
function get_random_color() { 
    var letters = 'ABCDEF'.split(''); 
    var color = '#'; 
    for (var i = 0; i < 6; i++) { 
     color += letters[Math.round(Math.random() * 15)]; 
    } 
    return color; 
} 
var data = new Array(500), types = ["date", "slider", "select", "string", "number", "rating", "level", "title"], 
    allowModify = [true, false], str = "Cell"; 
for(var i = 0; i < 500; i++){ 
    var arr = new Array(100); 
    for(var j = 0; j < 100; j++){ 
     var obj = {}; 
     obj.id = guid(); 
     obj.role = types[randomFromInterval(0, 6)]; 
     obj.selected = ""; 
     obj.writable = allowModify[randomFromInterval(0, 1)]; 
     switch(obj.role){ 
      case "slider": 
       obj.range = [0, randomFromInterval(0, 100)]; 
       obj.text = 0; 
       break; 
      case "select": 
       var num = randomFromInterval(2, 4), _options = Array(num); 
       for(var opt = 0; opt < num; opt += 1){ 
        _options[opt] = { 
         id : guid(), 
         text : ["Option[", opt + 1, "]"].join('') 
        } 
       } 
       obj.options = _options; 
       obj.selected = _options[randomFromInterval(0, num - 1)]; 
       obj.text = obj.selected.text; 
       obj.selected = obj.selected.id; 
       break; 
      case "date": 
       obj.text = [randomFromInterval(2000, 2013), randomFromInterval(1, 12), randomFromInterval(1, 25)].join('/'); 
       break; 
      case "string": 
       obj.text = [str, "[", i , "][", j, "]"].join(''); 
       break; 
      case "number": 
       obj.text = randomFromInterval(1, 176432); 
       break; 
      case "rating": 
       var _arr = [], colors = randomFromInterval(0, num - 1); 
       for(var i = 0; i < colors; i++){ 
        _arr[i] = get_random_color(); 
       } 
       obj.colors = _arr; 
       obj.text = _arr[1]; 
       break; 
      case "level": 
       obj.text = randomFromInterval(0, 100); 
       obj.valid = { 
        "0-40" : get_random_color(), 
        "40-50" : get_random_color(), 
        "50-100" : get_random_color() 
       } 
       break; 
     } 
     arr[j] = obj; 
    } 
    data[i] = arr; 
} 
console.log(data); 
+0

Vous êtes sûr que c'est infini? Ces deux boucles massives et une instruction switch à l'intérieur pourraient causer des ralentissements. – tymeJV

+0

Obtenez une copie de Firebug et parcourez le code dans le débogueur. C'est une méthode de débogage beaucoup plus efficace que de demander aux contributeurs de l'OS de deviner où se trouve l'erreur. –

+0

@MikeW J'ai débogué le code et quand je vais pas à pas, il n'y a pas de problème pour les premières itérations 3-4. Mais après cela, il est frappé. Même pour 100 boucles, dans la question que j'ai mentionné 500. – Exception

Répondre

2

Vous avez cette boucle intérieure:

for(var i = 0; i < colors; i++){ 
    arr[i] = get_random_color(); 
} 

Il remet à zéro la valeur de i, déconner la boucle extérieure. Vous pouvez résoudre ce problème en choisissant un autre nom au lieu de i ici.

+0

Belle prise :), erreur stupide de ma part. – Exception

3

Vous utilisez i deux fois dans la boucle, la première dans la boucle extérieure et la seconde dans la boucle sous « rating », ensembles Wich i au nombre de couleurs que je pense est moins Donc, s'il y a un objet avec le rôle "rating" dans les premiers objets, i n'atteindra jamais 500 et se terminant ainsi par une boucle infinie.