IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Mauvaise affectation de variable dans une boucle


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut Mauvaise affectation de variable dans une boucle
    Bonjour,
    je programme une petite application et je me heurte au problème suivant, concernant ce passage là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // création du tableau graphique
    var caz=0;
    for(i=0; i<n; i++)
    {
    var newRow = document.getElementById('grille').insertRow(-1);
    	for(j=0; j<n; j++)
    	{
    	var newCell = newRow.insertCell(j);
    	newCell.className='reus';
    	newCell.id='c'+caz;
    	newCell.onclick = function() {cpt=joue(caz,cpt);};
    	caz++;
    	}
    }
    Donc je créé un tableau graphique en Javascript et à chaque cellule, j'affecte une classe et un id, jusque là pas de problème mais quand je souhaite rajouter un onclick à ma cellule, et après la création de toutes les cellules, quand finalement je clique sur les différentes cases de ma grille (tableau) je me retrouve avec la variable caz passée en paramètre dans la fonction toujours égale au même chiffre, pour TOUTES mes cases, c'est à dire la dernière valeur de caz à la sortie de la boucle.

    J'en conclut donc que la fonction est appelée avec la valeur actuelle de caz et non avec la valeur au moment ou j'ai affecté ce onclick.

    Ceci me pose donc un réel souci sur lequel je me suis bien cassé la tête, en vain...

    Merci d'avance si vous avez des pistes pour moi.

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,
    Tu as parfaitement cerné le souci: la fonction est créée sur le clic, d'où la variable caz qui prend la valeur du moment. Pour changer ce comportement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    var caz=0;
    
    for(i=0; i<n; i++)
    {
    var newRow = document.getElementById('grille').insertRow(-1);
    	for(j=0; j<n; j++)
    	{
    	var newCell = newRow.insertCell(j);
    	newCell.className='reus';
    	newCell.id='c'+caz;
    	newCell.onclick = function (v) {
                          return function() {
                              cpt=joue(v,cpt);
                              };
                        }(caz); 
    	caz++;
    	}
    l'idée est de créer et exécuter sur le onclick une fonction avec comme paramètre caz, afin de transmettre sa valeur dans la boucle.

    ERE

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    En effet cela marche (n'a pas tout compris mais bon, va tâcher de comprendre), merci à toi.

  4. #4
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Re,
    Citation Envoyé par Isiker Voir le message
    En effet cela marche (n'a pas tout compris mais bon, va tâcher de comprendre), merci à toi.
    Quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newCell.onclick = function() {cpt=joue(caz,cpt);};
    alors JS crée la fonction et note la référence à la variable caz. Ensuite lors du clic la fonction est déclenchée et la variable caz est évaluée. Elle prend donc la dernière valeur affectée, cella à la sortie de ta boucle.

    Maintenant si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function doJoue(v) {
        return function() {
           cpt=joue(v,cpt);
        };
    }
    ...
    newCell.onclick = doJoue (caz);
    alors JS appelle doJoue en passant comme paramètre la valeur de caz; doJoue renvoie donc une fonction qui inclut la valeur de caz et non plus une référence à caz. Cela fait toute la différence.

    ERE

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'affectation de variable dans une boucle
    Par gabbf29 dans le forum Général Java
    Réponses: 28
    Dernier message: 03/10/2013, 13h11
  2. [ANT] affectation de variables dans une boucle
    Par dino_xrc dans le forum ANT
    Réponses: 6
    Dernier message: 17/12/2007, 19h47
  3. [SQL] Affectation d'une variable dans une boucle
    Par monlam dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/10/2007, 14h41
  4. Réponses: 3
    Dernier message: 01/09/2005, 11h56
  5. [langage] incrementation de variable dans une boucle
    Par mimilou dans le forum Langage
    Réponses: 15
    Dernier message: 16/04/2004, 13h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo