2010-07-03 7 views
4

J'ai quelques questions sur le javascript for loop.javascript pour le comportement inattendu de la boucle

Première question:

for (i=0; i<=2; i++) {;} 
console.log(i); 

est sortie 3. Ne devrait-il 2?

Deuxième question:

for (var i=0; i<=2; i++) { 
    setTimeout(function(){console.log(i);}, i*1000); 
} 

Timeouts sont correctement réglés: 0, 1000 et 2000. Mais la sortie est 3,3,3 (devrait être 0, 1, 2). Cela signifie-t-il que les fonctions retardées sont exécutées après la boucle se termine-t-elle? Pourquoi?

Que dois-je lire pour comprendre tous ces trucs mystérieux javascript?

Merci.

+0

+1 Je cherche aussi) – naiad

Répondre

9

Première question:

Non, car la variable i est incrémenté après la dernière itération réussie, la condition est vérifiée et il évalue à false de sorte que la boucle se termine.

La déclaration for est composé par:

for ([initialExpression]; [condition]; [incrementExpression]) 
    statement 

Et il est exécuté dans les étapes suivantes:

  1. Le initialExpression est évalué au début
  2. Le condition est évalué, si elle évalue à false, la boucle se termine, si elle évalue à true, l'instruction est évaluée.
  3. Évaluez l'instruction.
  4. Le incrementExpression est évalué, passez à l'étape 2.

Deuxième question:

La fonction est exécutée de manière asynchrone après la boucle est terminée, à ce moment comme vous le savez i contient 3 .

La solution courante est d'utiliser une fonction pour préserver la valeur de la variable en boucle à chaque itération, par exemple:

for (var i=0; i<=2; i++) { 
    (function (i) { 
    setTimeout(function(){console.log(i);}, i*1000); 
    })(i); 
} 
0

C'est parce que votre instruction CONSOLE.LOG est en dehors de la boucle.

Cela imprimer jusqu'à deux que vous aviez l'intention:

for (i=0; i<=2; i++) { 
    console.log(i); 
} 

Pour les boucles n'exécutera à plusieurs reprises ce que vous tapez dans les parenthèses. C'est pourquoi console.log n'a été exécuté qu'une seule fois.

Source: http://www.kompulsa.com/a-guide-to-for-loops-in-javascript/

Questions connexes