Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comprendre quelques notions.

Sujet résolu
    18 octobre 2010 à 14:04:45

    Bonjour tout le monde, :D

    voilà je me suis mis à développer en JavaScript et je vous avoue avoir du mal à comprendre certaines notions malgré mes recherches. C'est pourquoi je m'en remet à vous, si quelqu'un peut répondre clairement à mes questions :

    1°) J'ai utilisé en JavaScript des fonctions anonymes, fonction comme son nom l'indique sans nom, mais je vous avoue ne pas comprendre leur intérêt, quelle différence avec une fonction avec nom ?
    2°) Je ne comprends pas la différence entre mettre un "return 0 ;" en fin de fonction et ne pas le mettre quand la fonction ne renvoie rien.
    3°) Quelle est la différence entre l'appel d'une fonction avec parenthèses et sans parenthèses quand celle-ci ne reçoit rien. Est ce que lorsque l'on appelle la fonction ayant les paramètres, elle est directement exécuté, tandis que celle sans ne l'est pas directement ?

    Merci pour l'aide. ;)
    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2010 à 14:44:33

      Par exemple, à la place de ceci :

      function afficherUneAlerte(){
          alert('Hello world');
      }
      setTimeout(afficherUneAlerte,2000);
      


      Tu peux tout simplement écrire ceci :

      setTimeout(function(){
          alert('Hello world');
      },2000);
      


      Un autre avantage est d'isoler une portion de code. Les closures en sont un bon exemple.
      [re?]lis aussi cette partie du cours javascript : http://www.siteduzero.com/tutoriel-3-3 [...] tml#ss_part_4

      2°) Tu n'a qu'à tester :

      function f1(){
          return 0;
      }
      function f2(){
          // Aucune valeur retournée
      }
      
      alert(f1()); // Affiche 0
      alert(f2()); // Affiche undefined
      



      3°) Sans parenthèse, la fonction n'est PAS exécuter. En reprenant notre fonction précédente :

      afficherUneAlerte(); // Affiche 'Hello world';
      afficherUneAlerte; // Ne fais rien;
      


      afficherUneAlerte est une référence vers la fonction, qui permet par exemple de la passer en paramètre à une autre fonction, comme dans le premier exemple.
      • Partager sur Facebook
      • Partager sur Twitter
        18 octobre 2010 à 14:48:47

        Merci LCaba d'avoir pris la peine et le temps de me répondre.

        1°) Si je comprends bien, c'est pour simplifier du code, le raccourcir à part ça pas d'autre avantages.
        2°) J'ai effectivement testé, avant de poser ma question, si je comprends bien là aussi il est préférable de toujours renvoyer 0 pour retourner que tout s'est bien passé. Entre autre, ça fait plus propre et plus rigoureux ?
        3°) En fait pour cette question là, c'était plus précisément dans le cas d'un window.onload que je remarquais que si l'on faisait
        window.onload = afficher() ; // Effectue un alert avant le chargement de la page.
        window.onload = afficher ; // Effectue un alert après le chargement de la page.

        Merci.
        • Partager sur Facebook
        • Partager sur Twitter
          18 octobre 2010 à 14:52:07

          1) Elles fonctionnent pareil, tu utilises les fonctions anonymes lorsque tu n'as pas besoin de leur nom. Exemple :
          fonction son_nom()
          {
              alert('Truc Much');
          }
          setTimeout(son_nom,5000);
          

          Ici, il n'ya pas vraiment besoin de déclarer le nom de la fonction, on peut faire ça :
          setTimeout(fonction ()
          {
              alert('Truc Much');
          },5000);
          


          2) Le return fait beaucoup de choses. Il renvoie une valeur et return 0 est différent de return false ou return null. Or les fonctions void (sans return) renvoient null il me semble undefinied ce qui signifie "rien". De plus le return quitte la fonction. Donc :
          fonction bidule()
          {
              // Fais ceci et celà
              return 0;
              alert('Truc Much');
          }
          

          L'alerte ne s'affichera jamais car le return le court-circuite.

          Ensuite, si tu veux tester deux fonctions avec ou sans return :
          fonction f1()
          {
              // Vide
          }
          fonction f2()
          {
              return 0;
          }
          alert('f1()===0 : '+(f1()===0?'oui':'non')+'\nf2()===0 : '+(f2()===0?'oui':'non'));
          

          f2 est strictement égale à 0 et pas f1.

          3) Avec parenthèse : On obtient le résultat et la fonction s'exécute.
          Sans parenthèse : On obtient la fonction et elle n'est pas exécutée.
          fonction bidule()
          {
              alert('Chose');
              return 5;
          }
          
          var v1=bidule; // L'alerte ne se lance pas
          document.write(v1*2); // Écrit 0
          
          var v2=bidule(); // L'alerte se lance
          document.write(v2*2); // Écrit 10
          
          v1(); // Lance l'alerte
          document.write(v1()*2); // Lance l'alerte et écrit 10
          
          v2(); // Rien ne se passe
          document.write(v2()*2); // Écrit 0
          
          • Partager sur Facebook
          • Partager sur Twitter
            18 octobre 2010 à 14:59:36

            @ Kyle Katarn : petite rectification : sans return, la fonction renvoie undefined et pas null
            Et ce message n'est pas à ignorer complètement :

            Citation : SDZ

            Attention, il y a eu au moins une nouvelle réponse dans ce sujet le temps que vous remplissiez votre formulaire. Vous pouvez les voir dans les derniers messages, en dessous du formulaire. Si vous souhaitez quand même envoyer votre réponse, revalidez le formulaire.


            Citation


            window.onload = afficher() ; // Effectue un alert avant le chargement de la page.
            window.onload = afficher ; // Effectue un alert après le chargement de la page.



            Dans ces deux lignes tu affecte à window.onload (qui est une fonction), ce qu'il y a à droite du signe "=". Première ligne, il s'agit de afficher(), c'est à dire la valeur renvoyée par afficher (ce qu'il y a après return) après qu'elle se soit exécuter.
            Deuxième ligne, il s'agit de la fonction afficher. C'est cette ligne qui est correcte.
            • Partager sur Facebook
            • Partager sur Twitter
              18 octobre 2010 à 15:03:17

              Merci toi aussi, Kyle Katarn.

              Pour ce qui est des fonctions anonymes et des parenthèses donc question 1°) et 3°), j'ai bien saisi le truc.
              Mais pour le return, si un fonction( à savoir une procédure) ne renvoie rien, que doit elle donc renvoyer pour être correct (qu'est ce que c'est chelou l'informatique) 0 ou undefined ?
              Je vais regarder du côté dans la documentation de JavaScript et voir ce que je trouve là dessus.

              Merci pour tout.
              • Partager sur Facebook
              • Partager sur Twitter
                18 octobre 2010 à 15:47:37

                Le return; n'est pas nécessaire. Si tu n'as besoin ni de la valeur de retour, ni de sortir de la fonction, tu ne mets pas de return;
                Jette un oeil ici : http://goo.gl/QgFE
                • Partager sur Facebook
                • Partager sur Twitter
                  18 octobre 2010 à 17:10:29

                  @WarHack : Si tu as déjà programmé dans des langages fortement typés, tu connais peut-être le mot-clé void que l'on indique pour préciser qu'une fonction ne retourne rien.

                  En JavaScript, retourner undefined ou ne rien retourner, c'est pareil. Et c'est parfaitement autorisé. :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 octobre 2010 à 17:55:45

                    Sauf qu'en pratique on ne retroune jamais undefined. Enfin le faire serait une erreur.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 octobre 2010 à 18:58:34

                      Tu veux dire quoi par là ? Que c'est mieux de toujours mettre un return ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 octobre 2010 à 19:08:28

                        Non, je crois qu'il dit de pas écrire return undefined;

                        Plutôt écrire return; ou ne rien écrire du tout ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 octobre 2010 à 19:16:36

                          Yep @Golmote.
                          Je voulais pas préciser (ça va plus l'embrouiller qu'autre chose) mais undefined, c'est une variable déclarée (pour éviter les erreurs) mais non définie. Donc en fait tu peux lui assigner une valeur.
                          Et si tu le fais (ou qu'un autre script le fait), si tu retournes undefined, tu retournes sa valeur...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 octobre 2010 à 13:58:03

                            L'avantage du return 0 c'est de savoir que la fonction a bien été lu jusqu'a la fin, et je pense que c'est vis a vis du C qu'on a gardé l'habitude de mettre return 0 encore et toujours a la fin ( bien sur dans le cas ou elle ne doit pas retourner quelque chose d'autre) pour ainsi comparer si la fonction c'etait bien dérouler ou pas.

                            car une fonction en C peut retourner différente valeur, une si elle a fonctionné , une autre si elle n'a pas marché. ( et bien d'autre encore)
                            ( cf man )

                            J'ai bien compris qu'on parle du JS mais cette habitude que l'on a pris vient de la a mon avis :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 octobre 2010 à 14:24:34

                              En JS, t'utilise les exceptions si ça se passe mal.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 décembre 2011 à 22:20:18

                                J'ai relus le topic et vous remercie des réponses apportées.
                                J'ai tous bien saisi depuis :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 décembre 2011 à 15:36:00

                                  C'est mal de deterrer un topic comme ca :-°
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 décembre 2011 à 22:19:39

                                    Je n'ai pas eu le temps de remercier depuis :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Comprendre quelques notions.

                                    × 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