Auteur: Ludovic PATEY

Publié le 14 février 2008

Modifié le: 23 février 2008

Page d'accueil

Les fonctions

Vous êtes ici : Accueil / Cours / Cours de Javascript / Débuter en Javascript

Qu’est-ce qu’une fonction ?

Une fonction est un ensemble d’instructions qui, pour des paramètres donnés, retournera une valeur. Le principe de fonction en informatique est assez proche de celui d’une fonction mathématique.

La syntaxe d’une fonction en Javascript est la suivante :

function ma_fonction( param1, param2 ) {

       // Corps de la fonction

       return ma_valeur;

}

Prenons un exemple :

function somme( m, n ) {
       return m + n;
}


// Affichera 6
alert( somme( 2, 4 ) );

Une autre syntaxe de définition de fonction est :

var ma_fonction = function( param1, param2 ) {

       // Corps de la fonction

       return ma_valeur;
}

Cette seconde syntaxe sera très utilisée en programmation orientée objet.

Quelques définitions

L’ensemble function somme( m, n ) s’appelle signature de la fonction.

Le code entre les accolades est le corps de la fonction.

m et n sont les paramètres formels de la fonction.

La dernière ligne de code est un appel à la fonction.

2 et 4 sont les paramètres réels de la fonction.

L’arité est le nombre de paramètres formels d’une fonction.

Paramètres d’une fonction

Il est théoriquement possible de définir autant de paramètres que l’on veut. D’après mes tests sur Internet Explorer, son nombre maximum de paramètres est 32767.

Il n’est pas nécessaire que le nombre de paramètres formels et le nombre de paramètres réels soit le même : Si le nombre de paramètres réels est inférieur, les autres paramètres formels prennent la valeur null. Si le nombre de paramètres réels est supérieur, les derniers paramètres ne seront pas pris en compte.

Les paramètres formels d’une fonction ainsi que toute variable déclarée à l’intérieur d’une fonction ne sont pas accessibles en dehors de son corps. Ainsi, le code suivant retournera une erreur :

function test( a ) {

       var b = 6;

}

test( 3 );

alert( a );
alert( b );

La variable arguments contient un tableau des paramètres réels. Il permet de gérer les fonctions dont on ne connaît pas le nombre de paramètres. Nous n’avons pas encore vu les tableaux. Acceptez donc cette syntaxe pour l’instant et revenez dessus après les avoir étudiés.

Voyons un exemple d’une meilleure implémentation de la fonction somme :

function somme() {

       var retour = 0;

       // Aditionne tous les arguments
       for( var i=0; i<arguments.length; i++ ) {
               retour += arguments[i];
       }

       return retour;
}

alert( somme( 2, 6, 4 ) );

La fonction précédente peut maintenant aditionner autant de valeur que nous voulons.

Récursivité

Le corps d’une fonction pouvant contenir n’importe quelle instruction, il peut non seulement contenir des appels à d’autres fonction, mais également à lui même. L’appel d’une fonction par elle-même s’appelle la récursivité.

Exemple : Une définition récurrente de la factorielle.

function factorielle( n ) {

       return n == 0 ? 1 : n * factorielle( n - 1 );

}

Vous avez reconnu ici l’opérateur ternaire condition ? si oui : si non.

Attention ! il est absolument nécessaire de s’assurer une condition de sortie, sinon, la fonction va s’appeler en boucle jusqu’à ce qu’il n’y aie plus de place dans la pile. Vous aurez alors une erreur de type stack overflow.

La plupart des erreurs de récursivités provient des fonction qui s’appellent par l’intermédiaire d’une autre fonction. Voici un exemple de récursivité n’ayant pas de condition de sortie :

function est_inferieur( a, b ) {

       return !est_superieur( a, b );
}

function est_superieur( a, b ) {

       return !est_inferieur( a, b );
}

alert( est_inferieur( 3, 6 ) );

Il est possible de connaître la fonction appelante grâce la propriété caller. La notion de propriété est liée aux objets. Nous admettrons cette syntaxe pour l’instant et celle-ci sera justifiée ensuite lors de notre étude des objets.

La propriété caller retourne la fonction qui l’a appelée. Si la fonction n’a pas été appelée par une autre fonction, mais par un bloc d’instructions du fichier javascript directement, caller vaudra null :

function enfant() {
       alert( enfant.caller );
}

function parent() {
       enfant();
       alert( parent.caller );
}

parent();

Le code précédent va afficher successivement la source de la fonction parent() et null.

Il est possible de créer une fonction qui affichera le chemin emprunté pour accéder à une fonction. La fonction suivante existe dans beaucoup de langages est est très utilisée pour le débuggage :

function print_stack_trace() {

       // Se positionner sur la fonction printStackTrace
       var o = print_stack_trace;

       // Tant que la fonction est appelée par une autre fonction
       while( o.caller ) {

               // Afficher la fonction appelante
               alert( o.caller );

               // Se positionner sur la fonction appelante
               o = o.caller;
       }

}

Commentaires

Auteur :

Message :