Fonction dans une fonction

Fonction dans une fonction - HTML/CSS - Programmation

Marsh Posté le 28-09-2006 à 11:19:32    

Bonjour !
 
Voila, j'ai un problème.
J'ai une fonction dans la quelle j'ai écrit une sous fonction selon ce modèle :
 
function principale()
{
   ...
   function sous()
   {
      ...
   }
 
   sous();
}
 
Cependant, rien ne se passe et la console Javascript me dit que la fonction "sous" n'est pas définie. Comment cela se fait-il ?
 
Merci

Reply

Marsh Posté le 28-09-2006 à 11:19:32   

Reply

Marsh Posté le 28-09-2006 à 11:25:39    

Ca n'exise pas les sous-fonctions.
 
Tu peux passer par le modèle objet, mais c'est pas aussi simple que ça.
 

Code :
  1. function Rectangle(w, h)
  2. {
  3.     // Constructeur
  4.     this.width = w;
  5.     this.height = h;
  6.     // Méthodes
  7.     this.Perimeter = function () {return (this.width + this.height) * 2}
  8.     this.Area = function () {return this.widh * thiw.height}
  9.     this.Diagonal = function () {return Math.Sqrt(Math.Pow(this.width, 2) * Math.Pow(this.height, 2))}
  10. }
  11. var r = new Rectangle(3, 4);
  12. alert(r.Perimeter()); => 14
  13. alert(r.Area()); => 12
  14. alert(r.Diagonal); => 5

Reply

Marsh Posté le 28-09-2006 à 11:28:24    

Pourtant j'avais trouvé une fonction qui permet de changer le curseur et le faire suivre par une image :  
 
function changeCursor()
{
  // On affiche le div de la gomme
  document.getElementById("gomme" ).style.visibility="visible";
   
  // Fonction de détection de mouvement de curseur
  function MousePos(e)
  {
   x = (navigator.appName.substring(0,3) == "Net" ) ? e.pageX : event.x+document.body.scrollLeft;
   y = (navigator.appName.substring(0,3) == "Net" ) ? e.pageY : event.y+document.body.scrollTop;
   document.getElementById("gomme" ).style.top=(y+10);
   document.getElementById("gomme" ).style.left=(x+20);
  }
  if (navigator.appName.substring(0,3) == "Net" ) document.captureEvents(Event.MOUSEMOVE);
  document.onmousemove = MousePos;
}
 
Ce n'est pas de l'objet et ça fonctionne. Quelle est la différence entre cette fonction et la mienne niveau syntaxe ?

Reply

Marsh Posté le 28-09-2006 à 11:35:19    

tu appelles ta "sous-fonction" à partir de ta fonction.
dans l'exemple, ils reprennent le même système que dans l'objet : les "sous-fonctions" servent à être affectées comme méhodes (ou dans ton exemple, eventhandler) d'un objet.
"document" est bien un objet, et "onmousemove" est le handler de l'event "mousemove" de cet objet.
 
comme tu vois, on ne met pas les () après "MousePos", car on n'exécute pas la fonction, on ne fait que l'associer à onmousemove.

Reply

Marsh Posté le 28-09-2006 à 11:44:34    

Ah, ok, merci beacuoup pour ces eclaircissements.
Je pense pouvoir me débrouiller maintenant.
 
Merci ;)

Reply

Marsh Posté le 28-09-2006 à 12:09:18    

MagicBuzz a écrit :

Ca n'exise pas les sous-fonctions.


Si si :o C'est juste une histoire de namespace, la fonction que tu déclares dans une autre fonction n'est connue qu'à l'intérieur de celle-ci.
Et si c'est dans le cadre d'une conception objet, la fonction en question devient effectivement une methode mais privée.

Reply

Marsh Posté le 28-09-2006 à 12:14:26    

Et bien pourtant j'appelle la sous fonction dans la fonction principae seulement, et elle n'est pas reconnue...

Reply

Marsh Posté le 28-09-2006 à 12:16:01    

anapajari > je ne suis pas sûr que tu puisses appeler "directement" une fonction déclarée à l'intérieur d'une autre. pour moi il faut toujours passer par une affectation.

Reply

Marsh Posté le 28-09-2006 à 13:24:41    

MagicBuzz a écrit :

anapajari > je ne suis pas sûr que tu puisses appeler "directement" une fonction déclarée à l'intérieur d'une autre. pour moi il faut toujours passer par une affectation.


exemple:

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Exemple</title>
  7.   <script type="text/javascript">
  8.   function init(){
  9.     function addNode(parentNode, tagName, content){
  10.       parentNode = document.getElementById(parentNode)||parentNode;
  11.       var node = document.createElement(tagName);
  12.       node.appendChild(document.createTextNode(content));
  13.       parentNode.appendChild(node);
  14.     }
  15.     addNode(document.getElementsByTagName('body')[0], 'div', 'pouet pouet');
  16.   }
  17.   window.onload = init;
  18.   </script>
  19. </head>
  20. <body>
  21. </body>
  22. </html>


 

benjones a écrit :

Et bien pourtant j'appelle la sous fonction dans la fonction principae seulement, et elle n'est pas reconnue...


Dans le code au dessus, tu n'appeles pas la "sous-fonction" dans la fonction mais lorsque l'evenement mousemove se produit sur ton document. néanmoins cela devrait tout de même marcher, par exemple avec le code ci dessus:

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Exemple</title>
  7.   <script type="text/javascript">
  8.   function init(){
  9.     function addNode(parentNode, tagName, content){
  10.       parentNode = document.getElementById(parentNode)||parentNode;
  11.       var node = document.createElement(tagName);
  12.       node.appendChild(document.createTextNode(content));
  13.       parentNode.appendChild(node);
  14.     }
  15.     document.onclick = function(e){
  16.       addNode(document.getElementsByTagName('body')[0], 'div', 'pouet pouet');
  17.     }
  18.   }
  19.   window.onload = init;
  20.   </script>
  21. </head>
  22. <body>
  23. </body>
  24. </html>


Reply

Marsh Posté le 28-09-2006 à 14:23:46    

anapajari > non, regarde son premier post. s'il a réellement saisi ce qu'il a écrit, alors y'a un souci, parcequ'il fait comme tu dis.
 
(ceci dit, bah je vois pas trop l'intérêt d'utiliser des sous-fonctions)

Reply

Marsh Posté le 28-09-2006 à 14:23:46   

Reply

Marsh Posté le 28-09-2006 à 15:11:20    

si je regarde son premier post, tout me laisse croire qu'il a une erreur dans le code dans sa fonction sous() et que donc le problème ne vient pas de l'utilisation de celle-ci.
edit: et si tu te demandes pourquoi ça fonctionne "aussi" quand on fait

Code :
  1. unNoeud.unEvent = nomDeLaFonction


C'est parce qu'en faisant ça tu attaches à l'event le "code" de la fonction et pas la fonction elle-même. Ce que tu peux contaster à n'importe quel moment en faisant:

Code :
  1. alert(nomDeLaFonction)


 
Les sous fonctions sont utiles si tu as besoin de fonctions portant le même nom dans des namspaces différents [:spamafote]. Encore que personnellement je préfère les mettre dans des "packages" ( en fait des tableaux.


Message édité par anapajari le 28-09-2006 à 15:13:08
Reply

Marsh Posté le 28-09-2006 à 15:44:50    

=> en réalité, le "unNoeud = nomDeLaFonction", c'est plutôt une affectation d'un pointeur vers la fonction. Le code de la fonction ne s'affiche quand on fait le alert(nomdelafonction) que parceque "ToSource()" est la méthode par défaut associée à ce type de variable ;)

Reply

Marsh Posté le 28-09-2006 à 17:19:56    

ok tu chipottes sur les mots alors que je vulgarisais mais si tu veux ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed