Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème d'instanciation de fonction

    21 avril 2017 à 2:48:42

    Bonjour, j'ai fait une fonction et dans son bloc d'instruction j'incremente une variable de 1 à chaque appel de la fonction.

    Le truc c'est que pour incrémenté j' ai été obligé de créer une variable globale que j'initialise a zero. Si il n' y a qu'une instance de la fonction cela ne pause pas de soucis mais si j' en utilise plusieurs évidément elles utilisent la même variable globale et du coup c'est pas terrible.

    En gros c' est ca. C'est pour faire comme un switch au click d'un bouton 0->1 ... 1->0 etc:

    var init = 0;
    
    function maFonction()
    {
        init += 1;
        monSwitch = init % 2;
    }

    Si j'initialise ma variable "init" dans la fonction, à chaque appel de la fonction ça recommence à 0 donc ça me fait : 0->1 ... 0->1 etc.

    Si je la laisse en globale là c 'est l'une ou l'autre des instances qui décale le compteur des autres instances. Je sais pas si je suis très clair mais si quelqu'un a compris mon problème et a une solution je suis preneur.

    Merci par avance.

    • Partager sur Facebook
    • Partager sur Twitter
      21 avril 2017 à 3:17:55

      Salut,

      Tu peut utilisé les générateur : 

      function* toogleGenerator() {
        let val = 0
        while (true) {
          yield val
          val = val === 0 ? 1 : 0
        }
      }
      
      let mySwitch = toogleGenerator()
      console.log(mySwitch.next().value) // 0
      console.log(mySwitch.next().value) // 1
      console.log(mySwitch.next().value) // 0
      console.log(mySwitch.next().value) // 1



      -
      Edité par GannoN 21 avril 2017 à 3:18:13

      • Partager sur Facebook
      • Partager sur Twitter
        21 avril 2017 à 8:23:25

        Merci GanoN je vais essayer ça des que je rentre ce soir.  

        edit: J' ai essayé du coup et je sais pas ou je merdouille mais j' ai des erreurs dans la console. Pourtant ton script fonctionne impec quand je l'essaye, mais dans mon bazar ça ne va pas, je n'arrive pas à l'implémenté. Mais j' ai trouvé une autre solution. Avec classlist.toggle à chaque appel je crée ou supprime un class nommé "switch" sur la div sur laquelle ma fonction agit et en contition au lieu d' avoir un 1 ou un 0 j' ai :  si la class existe alors instruction.. aussi non instruction.. et chaque instance de la fonction est indepandante.

        je vais planché quand même sur les generateurs ça a l'air bien pratique. merci encore

        edit edit : j' ai refait ton code tranquillou et j' ai percuté je crois. la boucle infini (je connaissais pas), si "val" est strictement égale a zero alors "val" vaut 1 et tour d' apres ça ne sera pas le cas donc val vaut 0. nickel merci encore j' en aurais surrement besoin plus tard. ;)

        -
        Edité par -Dric- 21 avril 2017 à 20:10:38

        • Partager sur Facebook
        • Partager sur Twitter
          22 avril 2017 à 1:09:13

          Sans forcément utilisé de generator qui ne sont dispo que sur node 6+ ou en ES7.
          Tu peux utiliser les closures :

          var maFonction = (function() {
            var init = 0;
          
            return function() {
              init += 1;
              monSwitch = init % 2;
              return monSwitch;
            }
          })();


           

          • Partager sur Facebook
          • Partager sur Twitter
            22 avril 2017 à 11:06:08

            Salut

            Voici ce que j'utilise actuellement.

            Apres avoir récupéré les boutons je leurs applique un attribut data-state avec une valeur par défaut.

            Au click je change cette valeur.

            Exemple:

            <!DOCTYPE html>
            <html lang="en">
            
            <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Document</title>
            </head>
            
            <body>
              <button>1</button>
              <button>2</button>
              <button>3</button>
              <button>4</button>
              <button>5</button>
            
              <script>
                const buttons = document.querySelectorAll('button');
            
                buttons.forEach((index) => {
                  index.setAttribute('data-state', '0');
                  index.addEventListener('click', (e) => {
                    e.target.dataset.state != 1 ? e.target.dataset.state = 1 : e.target.dataset.state = 0;
                    // Debug // 
                    console.log(e.target.dataset.state)
                  })
                })
              </script>
            </body>
            
            </html>



            • Partager sur Facebook
            • Partager sur Twitter
              22 avril 2017 à 22:22:35

              ChibiBlasphem a écrit:

              Sans forcément utilisé de generator qui ne sont dispo que sur node 6+ ou en ES7.
              Tu peux utiliser les closures :

              Merci pour l'info, des closures. c'est bien l' equivalent du "module pattern" c'est ca? ici

              j'ai pas encore bien tout compris sur leur mode fonctionnement. je m'ensuis servis pour encapsuler un bloc de code pour l'isoler du reste de mon script, j'avais pas besoins de valeur de retour. J' ai pas bien compris comment recuperer la valeur du "return.

              je vais essayer de voir ce que je peut faire a partir de ton exemple.

              Alexander M: merci du pour l'info

              -
              Edité par -Dric- 22 avril 2017 à 22:25:25

              • Partager sur Facebook
              • Partager sur Twitter

              problème d'instanciation de fonction

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown