Definition des fonctions : Pige pas

Definition des fonctions : Pige pas - HTML/CSS - Programmation

Marsh Posté le 20-04-2008 à 00:20:18    

Bonjour, j'essaye de faire joujou avec Yahoo User interface, j'ai commencé par le commencement, et je bloque sur la compréhension de la définition d'une fonction JS.
 
J'ai un niveau "tout juste moyen" en JS, et pour moi on définit une fonction comme ca :
 

Code :
  1. function mafonction(arga, argb)
  2. {
  3. le contenu de la fonction
  4. }


 
Et là, je me retrouve avec ca :

Code :
  1. <script>
  2. (function() {
  3. //A function that pops up a "Hello World" alert:
  4. var helloWorld = function(e) {
  5. alert("Hello World!" );
  6. }
  7. //subscribe the helloWorld function as an event
  8. //handler for the click event on the container
  9. //div:
  10. YAHOO.util.Event.addListener("container", "click", helloWorld);
  11. //A function that pops up an alert and
  12. //prevents the default behavior of the event
  13. //for which it is a handler:
  14. var interceptLink = function(e) {
  15. YAHOO.util.Event.preventDefault(e);
  16. YAHOO.log("You clicked on the second YUI link.", "info", "example" );
  17. alert("You clicked on the second YUI link." );
  18. }
  19. //subscribe our interceptLink function
  20. //as a click handler for the second anchor
  21. //element:
  22. YAHOO.util.Event.addListener("secondA", "click", interceptLink);
  23. //log message to indicate that the example is ready:
  24. YAHOO.log("When you begin interacting with the example at left, you'll see log messages appear here.", "info", "example" );
  25. })();
  26. </script>


 
J'ai du mal à comprendre à quoi sert le (function() du début et comment ca définit des fonctions ... car après ils appellent "helloWorld' (via le eventhandler)  :pt1cable:


Message édité par getget le 20-04-2008 à 13:31:55

---------------
Gamertag : Getget94 - PSN : Getget1980 - Nintendo Network : Getget1980 - Uplau : Getget1980
Reply

Marsh Posté le 20-04-2008 à 00:20:18   

Reply

Marsh Posté le 20-04-2008 à 08:07:03    

Up !


---------------
Gamertag : Getget94 - PSN : Getget1980 - Nintendo Network : Getget1980 - Uplau : Getget1980
Reply

Marsh Posté le 20-04-2008 à 13:32:09    

Upeuh :cry:


---------------
Gamertag : Getget94 - PSN : Getget1980 - Nintendo Network : Getget1980 - Uplau : Getget1980
Reply

Marsh Posté le 20-04-2008 à 22:46:53    

Personne pour m'expliquer parmis les 60 lurkeurs :cry:


Message édité par getget le 20-04-2008 à 22:53:48

---------------
Gamertag : Getget94 - PSN : Getget1980 - Nintendo Network : Getget1980 - Uplau : Getget1980
Reply

Marsh Posté le 21-04-2008 à 09:13:32    

je dis peut être une connerie mais  
au lieu d'écrire séparément la définition de la fonction et son appel :
 

function tartampion () {
 def de ma fonction  
};
tartampion();


 
ils mettent la définition et l'appel en une seule "ligne"


(  
function () {
 def de ma fonction  
}  
) ();


c'est ça qui te pose problème ?


Message édité par stitch+ le 21-04-2008 à 09:14:46

---------------
viendez broder, mon blog et à écouter : la Pause Bad, parlons badminton
Reply

Marsh Posté le 21-04-2008 à 09:21:27    

L'appel il se fait via YUI, ca doit être cette ligne là :
 

Code :
  1. YAHOO.util.Event.addListener("secondA", "click", interceptLink);


 
Ce que je pige pas déjà c'est que le function() soit tout seul, le tartempion est plus bas ... on dirait une sorte de "multi définition", pour définit plusieurs fonctions d'un coup ....


---------------
Gamertag : Getget94 - PSN : Getget1980 - Nintendo Network : Getget1980 - Uplau : Getget1980
Reply

Marsh Posté le 21-04-2008 à 09:26:42    

getget a écrit :

L'appel il se fait via YUI, ca doit être cette ligne là :
 

Code :
  1. YAHOO.util.Event.addListener("secondA", "click", interceptLink);


 
Ce que je pige pas déjà c'est que le function() soit tout seul, le tartempion est plus bas ... on dirait une sorte de "multi définition", pour définit plusieurs fonctions d'un coup ....


**buuuuuuuump** (bruit du buzzer disant "t'as tort" )
c'est du JS,
 
si tu veux qu'au moment d'une action/event, une chose se passe, il faut mettre en place un listener
faut voir ça comme de la chasse : si tu veux réagir au "click", il faut d'abord que tu tendes le piège (le "listener" )
et pour tendre le piège, il faut que tu appelles tartampion
 
ta fonction tartampion contient d'autres fonctions, et ça c'est normal/logique aussi


---------------
viendez broder, mon blog et à écouter : la Pause Bad, parlons badminton
Reply

Marsh Posté le 21-04-2008 à 09:33:00    

Mes fonctions, c'est bien helloWorld et interceptlink dans cet exemple non ?
 
Si je les appelle elle vont s'exécuter non?
 
Du coup, pour moi YAHOO.util.Event.addListener("secondA", "click", interceptLink); exécute interceptlink quand je clique sur l'élément dans le DOM dont le nom est secondA non ?


---------------
Gamertag : Getget94 - PSN : Getget1980 - Nintendo Network : Getget1980 - Uplau : Getget1980
Reply

Marsh Posté le 21-04-2008 à 09:41:40    

j'essaye de t'expliquer que si le code avait été écrit ainsi c'était pareil :

Code :
  1. <script>
  2. function tartampion() {
  3. var helloWorld = function(e) {
  4.  alert("Hello World!" );
  5. }
  6. YAHOO.util.Event.addListener("container", "click", helloWorld);
  7. var interceptLink = function(e) {
  8.  YAHOO.util.Event.preventDefault(e);
  9.  YAHOO.log("You clicked on the second YUI link.", "info", "example" );
  10.  alert("You clicked on the second YUI link." );
  11. }
  12. YAHOO.util.Event.addListener("secondA", "click", interceptLink);
  13. YAHOO
  14.   .log(
  15.     "When you begin interacting with the example at left, you'll see log messages appear here.",
  16.     "info", "example" );
  17. }
  18. tartampion();
  19. </script>
 

en dehors de tartampion, si tu appelles helloworld ou interceptlink, elles seront indéfinies.
Elles ne sont définies que dans tartampion, et dans ton exemple, elles ne sont définies que dans la fonction qui se définit sans nom et s'appelle immédiatement

 

si la fonction interceptlink s'éxécute quand tu cliques sur l'élément, c'est parce que tartampion a été appelé et qu'il a mis en place le listener pour réagir au clic.

 

je commence à ne pas comprendre ce que tu ne comprends pas.


Message édité par stitch+ le 21-04-2008 à 09:42:08

---------------
viendez broder, mon blog et à écouter : la Pause Bad, parlons badminton
Reply

Marsh Posté le 21-04-2008 à 09:43:50    

getget a écrit :

L'appel il se fait via YUI, ca doit être cette ligne là :
 

Code :
  1. YAHOO.util.Event.addListener("secondA", "click", interceptLink);


 
Ce que je pige pas déjà c'est que le function() soit tout seul, le tartempion est plus bas ... on dirait une sorte de "multi définition", pour définit plusieurs fonctions d'un coup ....


Tu as la definition d'une fonction anonyme et son appel en un seul coup:
La définition de ladite fonction:
function() {
..................
};
La définition et appel:
(function() {
.....................
})();
 
Le corps de la fonction anonyme fait trois choses:
YAHOO.util.Event.addListener("container", "click", helloWorld);  
YAHOO.util.Event.addListener("secondA", "click", interceptLink);
YAHOO.log("When you begin interacting with the example at left, you'll see log messages appear here.", "info", "example" );
 
et pour faire ces trois choses, il a besoin de deux fonctions auxiliaires (qui seront appellées quand le contexte element/evenement sera realisé), passées comme argument dans les appels précedents: helloWorld, interceptLink, qui sont alors elles aussi definies dans le corps de la fonction anonyme:
 
var helloWorld = function(e) {
alert("Hello World!" );
}
 
et  
 
var interceptLink = function(e) {
YAHOO.util.Event.preventDefault(e);
YAHOO.log("You clicked on the second YUI link.", "info", "example" );
alert("You clicked on the second YUI link." );
}
 
Ca devrait t'être plus clair maintenant.
 
A+,
 
 
 


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Marsh Posté le 21-04-2008 à 09:43:50   

Reply

Marsh Posté le 21-04-2008 à 10:04:18    

Ok, merci à vous 2, je commence à piger, en fait ils ont fait comme ca pour faire des fonctions locales auxquelles on rattache le handler :)

 

Par contre,

 

var helloworld = function (e) {}

 

C'est pareil que

 

function helloworld(e) {} ?

 


Message édité par getget le 21-04-2008 à 10:04:41

---------------
Gamertag : Getget94 - PSN : Getget1980 - Nintendo Network : Getget1980 - Uplau : Getget1980
Reply

Marsh Posté le 21-04-2008 à 10:18:26    

[NOTE: je ne suis pas specialiste de Javascript, alors je raconte peut être des betises ici, je donne simplement mon impression]
Dans le même bloc, oui, c'est grosso modo la meme chose, mais ici, helloworld disparait lorsque l'on sort du corps de la fonction anonyme, puisqu'elle est définie dedans. Donc au moment de son appel par déclenchement de l'évènement sur l'élément DOM, elle n'existe a priori plus si on est passé par: function helloworld(e) {}  
Tandis qu'en faisant var helloworld = function (e) {}, on a transmis en parametre le code de la fonction (ou un pointeur sur, ce qui va bloquer le destruction du code correspondant a la sortie de la fonction anonyme, je ne sait pas comment ca marche en interne dans js), et donc au déclenchement de l'évènement sur l'élément DOM, il va y avoir du code a executer.
 
A+,


Message édité par gilou le 21-04-2008 à 10:19:13

---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Marsh Posté le 21-04-2008 à 10:52:10    

la déclaration suivante :  
 

Code :
  1. function() {
  2.   //blabla
  3. }()


Permet de déclarer du code dans une fonction anonyme et d'éxécuter aussitôt la fonction ( les parenthèses après l'accolade le permettent)
C'est plutôt utile quand tu ne veux pas que ton code vienne gêner le code des autres (écrasement d'une variable portant le même nom (ou d'une fonction)).

Reply

Sujets relatifs:

Leave a Replay

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