2010-09-03 9 views
2

J'essaie de comprendre comment générer des fonctions à l'intérieur de la boucle. Je:Javascript for loop, variable d'index dans la fonction

for (var i = fir_0_f.length - 1; i >= 0; i--){ 
    var next = i+1; 
    var N = i; 
    // Attemps 
     //goal0_[i](next,N); 
     //eval('goal0_'+i+'('+next+', '+N+')'); 
}; 

ont fait aussi quelques recherches. [] attend une chaîne, eval() est une pratique de B.A.D. Est-ce qu'il y a un autre moyen? Comment régler le délai pour chaque fonction plus tard? Alors ils courraient sequentally?

Merci beaucoup!

+0

Pouvez-vous montrer le code où les fonctions sont définies? Changer cela pourrait simplifier les choses. – sje397

Répondre

1
for (var i = fir_0_f.length - 1; i >= 0; i--){ 
    var next = i+1; 
    var N = i; 
    setTimeout('goal0_'+i+'('+next+','+N+')', 0); 
} 

Note: Les erreurs lancées par goal0_ i ne seront pas pris par la boucle. J'ai remarqué ce comportement dans Firefox. Cela signifie que les éléments suivants ne fonctionnera pas comme prévu:

try{ 
    setTimeout(function_throwing_error, 0); 
} 
catch(e){ 
    alert("I kill you!"); 
} 
0

Pour les fonctions globales, vous pouvez simplement faire:

window['goal0_'+i](next, N); 
4

En JavaScript, vous pouvez utiliser des expressions de fonction pour construire une gamme de fonctions:

var goals = []; 

goals.push((function (param1, param2) { 
    // your code for the first function 
})); 

goals.push((function (param1, param2) { 
    // your code for the second function 
})); 

// ... etc 

Ensuite, dans votre boucle, vous pouvez simplement référencer vos fonctions comme éléments d'un tableau:

goals[i](next, N); 

UPDATE:

Pour appeler vos fonctions avec un délai entre elles, vous devez changer votre logique de boucle. Au lieu d'utiliser une boucle for, appelez immédiatement la première fonction, puis, après son exécution, appelez la seconde en utilisant setTimeout().

+0

Bonne idée. Comment alors exécuter chaque fonction avec timeout dans la boucle? D'abord exécuterait immédiatement, d'autres avec délai. – c4rrt3r

+0

@ c4rrt3r: Mise à jour ma réponse avec un commentaire sur le délai d'expiration. –

Questions connexes