Une fonction est une suite d'instructions ayant un rôle précis (pour ne pas dire une fonction précise…).
var message = prompt('Entrez un texte');
Voici comment on pourrait schématiser une fonction :
Les fonctions que nous allons créer fonctionnent selon le même principe.
Dans de ce chapitre, notre fonction aura pour but de convertir des Euros en Francs (c'est un bon exemple, même s'il est un peu démodé
).
Mais on peut bien faire ça sans avoir besoin de faire une fonction ?
Oui, mais en créant une fonction, nous pourrons lancer le script à chaque fois que nous en aurons envie
.
Il nous suffira pour cela d'appeler cette fonction.
Commençons par quelques mots de vocabulaire :
Voyons comment faire notre propre fonction : nous allons utiliser l'exemple du convertisseur dont je vous ai parlé plus haut.
On commence par déclarer notre fonction : on va dire à l'ordinateur “je veux créer une fonction qui s'appelle machin et qui fait ceci”. Quelques informations à ce sujet :
J'attire votre attention sur ces parenthèses. Elles sont indispensables, même si elles sont vides.
Si on récapitule ce que je viens de dire, on peut déjà déclarer notre fonction. Nommons-la conversion. On obtient donc ceci :
function conversion()
Contenu de la fonction
On fait suivre cette déclaration du contenu de la fonction (les instructions de celle-ci).
S'il y a plusieurs instructions (ce qui est généralement le cas
), on délimite le contenu de notre fonction grâce à des accolades { et } : on forme alors ce qu'on appelle un bloc d'instructions.
Il va donc falloir écrire le code entre accolades, à la suite de la ligne :
function conversion()
Quel code ? Eh bien celui que la fonction doit exécuter. Si on résume, on veut :
On ne s'occupe pas d'arrondir le résultat, ni de vérifier si l'utilisateur écrit bien un nombre (si c'est un boulet, tant pis pour lui
).
Essayez de coder cela vous-mêmes, ça ne devrait pas vous poser de problème… Vous avez terminé ? Parfait, voici ce que ça nous donne :
function conversion() { var somme = prompt("Entrez la valeur en Euros :"); var resultat = somme * 6.55957; alert(somme + " E\n" + resultat + " Frs"); }
Nous venons de créer notre première fonction.
Ça va, vous n'êtes pas trop émus ?
Maintenant que notre fonction est créée, on va enfin pouvoir l'utiliser
.
Pour cela, on écrit simplement ceci (dans le corps de la page cette fois) :
conversion();
Et notre fonction est exécutée !
Elle va, comme nous le voulions, demander une valeur (en euros) à l'utilisateur, et lui afficher le résultat de la conversion en francs.
Revenons à notre fonction de conversion : nous allons lui faire subir quelques modifications.
L'idée est, avec une unique fonction, de pouvoir convertir tout type d'unités.
Par exemple, on peut faire un bouton qui, lorsqu'on cliquerait dessus, convertirait des mètres en centimètres, et une image convertissant les Euros en Francs.
En y réfléchissant, le code à exécuter serait presque le même, il n'y a que le taux de conversion et le nom des unités qui changent…
Il nous suffirait, au moment de l'appel de la fonction, de dire : “le taux de change est de 6.55957, et les unités sont les Euros et les Francs”.
Eh bien c'est possible grâce aux arguments !
Pour vous en expliquer le principe, je vais prendre l'exemple d'une balise (x)HTML :
<img src="EuroFrancs.png" alt="" />
Ce code insère une image.
L'image qui est affichée est celle dont on a indiqué le nom : on utilise la même balise (c'est <img />
quelle que soit l'image, mais en précisant quelle image on veut afficher.
Eh bien c'est exactement le même principe : on va indiquer à notre fonction le taux de conversion à utiliser…
On va reprendre notre fonction de conversion, en y apportant quelques modifications : commençons par enlever les unités (on les ajoutera plus tard), et ajouter un argument : le taux de change.
On pourra ainsi, à partir de cette même fonction, convertir tout ce qu'on veut.
Si on veut convertir des euros en francs, on n'aura qu'à écrire conversion(6.55957).
Pour convertir des mètres en centimètres, ça sera conversion(100) (1 m = 100 cm).
Il nous suffit de préciser le taux entre les parenthèses. Pratique, pas vrai ? 
Allons-y :
tout d'abord, lors de la déclaration de la fonction, il nous faut préciser entre les parenthèses le nom de l'argument : appelons-le taux.
Lorsqu'on appellera la fonction conversion(6.55957), cela aura pour effet de créer une variable taux avant d'exécuter la fonction, et cette variable aura pour valeur 6.55957.
Elle sera détruite une fois la fonction exécutée.
Voici le code modifié et commenté :
function conversion(taux) // declaration de la fonction avec un argument { var valeur = prompt("Entrez la valeur à convertir"); var resultat = valeur * taux; // on calcule le resultat, en utilisant l'argument alert('Valeur : '+valeur + '\nRésultat : '+resultat); }
Il ne faut donc pas oublier de préciser ce taux lorsqu'on appellera la fonction :
<p> <img src="EuroFrancs.png" alt="" onclick="conversion(6.55957)" /> </p>
Et si on veut convertir des mètres en centimètres, pas besoin d'une autre fonction, il suffit de faire comme ceci :
<p> <a href="#" onclick="conversion(100)">Conversion mètres > centimètres</a> </p>
Il serait tout de même plus agréable de voir s'afficher le nom des unités…
Eh bien il suffit pour cela de créer deux arguments supplémentaires !
Rien de bien compliqué, il faut juste les séparer par des virgules. Vous pouvez les créer dans l'ordre que vous voulez (essayez cependant d'utiliser un ordre “logique”).
Ensuite, lorsque vous appellerez votre fonction, il faudra donner les paramètres dans le même ordre (si le taux de conversion est le premier, on l'indiquera en premier - logique
).
Choisissons cet ordre : unité 1, taux et unité 2.
Après quelques modifications apportées à notre fonction, on obtient ceci :
function conversion(unite1, taux, unite2) { var valeur = prompt("Entrez la valeur à convertir, en " + unite1); var resultat = valeur * taux; alert(valeur + ' ' + unite1 + '\n' + resultat + ' ' + unite2); }
Et on l'appelle ensuite de cette manière :
<p> <img src="EuroFrancs.png" alt="" onclick="conversion('Euros', 6.55957, 'Frs')" /> <br /> <a href="#" onclick="conversion('m',100, 'cm')">Conversion mètres > centimètres</a> </p>
Je vous laisse tester…
Ça commence à avoir de la gueule, pas vrai ? 
Il est possible de créer des arguments facultatifs : on peut choisir de ne pas les préciser lors de l'appel de notre fonction.
Par exemple, il serait possible de créer une fonction qui additionne tous les nombres passés en arguments :
addition(12, 5); // nous donnerait 17 addition(21, 4, 15, 11, 6); // nous donnerait 57
Ceci n'étant qu'un exemple.
Tenez, vous rappelez-vous de notre fonction prompt() ? Eh bien elle possède un second paramètre facultatif : la valeur initiale du champ de saisie. Essayez plutôt ceci :
var nombre = prompt('Entrez un nombre', 'Votre nombre ici'); alert('Vous avez tapé ' + nombre);
Si on ne donne pas de second paramètre, le champ est initialement vide. Mais si on en indique un, alors il aura cette valeur.
Je vous parle de ces arguments pour que vous sachiez qu'ils existent.
Cependant, créer des paramètres facultatifs fait appel à des notions que vous ne connaissez pas encore. Nous approfondirons donc ce sujet un peu plus tard, dès que vous aurez les éléments nécessaires.
Comme je vous l'ai annoncé plus haut, les arguments ne sont en fait rien d'autre que des variables, mais propres à la fonction : elles sont créées lors de son appel, et elles sont détruites à la fin de celle-ci.
Voici une fonction :
function essai(argument1, argument2) { // code de la fonction }
Et un appel de cette fonction :
essai(57, 'un message');
Lorsqu'on appellera cette fonction ainsi, voici comment ça se passera :
Essayez donc de créer cette fonction, de l'appeler, et une fois cette dernière terminée, d'afficher la valeur de la variable argument1 : ça ne marche pas. C'est normal, elle a été détruite.
Essayez de renouveler l'opération, mais en créant vous-mêmes une variable à l'intérieur de la fonction, comme ceci :
function essai() { var variable = 'Bonjour'; }
Appelez ensuite cette fonction, puis affichez la valeur de cette variable, comme ceci :
essai(); alert(variable);
Cette fois non plus, ça ne marche pas !
À la fin d'une fonction, toutes les variables déclarées à l'intérieur de celle-ci sont détruites.
On utilise le terme de variables locales.
Notez que j'ai bien parlé de déclaration, ce qui signifie l'utilisation de var.
Voici pourquoi, dans le dernier exemple, ça ne “marchait pas”.
Mais c'est nul ! :waw: Pourquoi on ne peut pas accéder quand on veut et où on veut à toutes les variables ?!
Eh bien imaginez le bazar !
Certaines variables seront peut-être utilisées plusieurs fois (si vous donnez le même nom à deux variables différentes, par exemple).
De plus, il est moyennement apprécié (pour ne pas dire qu'il ne faut jamais le faire) de déclarer plusieurs fois la même variable.
Enfin bref, c'est ingérable.
Au moins, avec les variables locales, c'est bien rangé : chaque fonction a ses variables à elle seule,
on peut donc les modifier sans craindre de modifier une variable d'une autre fonction.
Et il suffit d'utiliser les arguments pour passer des valeurs d'une fonction à l'autre.
Il est quand même possible de créer des variables dites globales, c'est-à-dire accessibles depuis n'importe quelle fonction.
Ces variables sont à utiliser le moins possible !
Si une variable locale suffit pour telle utilisation, ne créez pas une variable globale en vous disant : “comme ça, je pourrai l'utiliser de partout”.
Pour créer une telle variable, il y a deux solutions :
// on cree deux variables globales var variable1; var variable2 = 0; function essai() { variable1 = 1; variable2 = 8; // modification des variables globales } // ces deux variables seront encore accessibles une fois la fonction terminée
Au risque de me répéter, je vous rappelle qu'il faut privilégier au maximum l'emploi de variables locales…
Partons de cet exemple, que vous connaissez tous :
var ma_variable = prompt('Entrez une valeur');
On utilise le signe = : mais comment une fonction peut-elle avoir une valeur ?
Prenons l'exemple des fonctions en mathématiques…
Soit f la fonction définie par f(x) = 5x - 3.
On a f(x) = 5x - 3 …c'est bien ce signe = qui nous intéresse !
Eh bien essayons de créer une fonction f qui fait la même chose que notre fonction mathématique.
On peut d'ores et déjà écrire la première ligne de code :
function f(x)
On déclare une fonction nommée f ayant un seul attribut, nommé x.
Que va contenir cette fonction ?
On va également créer une variable pour le résultat du calcul : appelons-la resultat (très original, n'est-ce pas ?).
var resultat = 5*x - 3;
On a notre fonction et notre résultat, il nous reste plus qu'à dire : “je veux que ma fonction prenne cette valeur”.
Pour employer le terme exact, on veut que notre fonction renvoie (ou retourne) cette valeur.
Par exemple, avec prompt, la valeur retournée est le texte tapé par l'utilisateur.
Dans notre cas, c'est le contenu de la variable resultat.
Pour ce faire, on fait précéder la valeur à renvoyer du mot-clé return.
return resultat;
return;
On assemble maintenant tous nos morceaux, voici la fonction f telle qu'on pourrait la coder en JS :
function f(x) { var resultat = 5*x - 3; return resultat; }
On teste de cette manière (ou en enregistrant le résultat dans une variable) :
alert( f(7) );
Et… on voit s'afficher le résultat : 32
.
De cette manière, vous pouvez créer toutes sortes de fonctions (particulièrement mathématiques
.
Voici quelques exemples :
Voici la correction (vous pouvez faire différemment, avec une variable par exemple) :
function triple(x) { return 3*x; } function carre(x) { return x*x; } function cube(x) { return x*x*x; }
Un exemple de calcul dans lequel on voit clairement l'utilité de ceci :
var resultat = 4*cube(5) - 7*3 / carre(6);
function sayHello() { return 'Bonjour !'; // L'instruction « return » suivie d'une valeur, cette dernière est donc renvoyée par la fonction } alert(sayHello()); // Ici on affiche la valeur retournée par la fonction sayHello() // ou alors on stocke le return dans une variable comme ceci var gloups = sayHello(); alert(gloups);
function triple (argu1){ var result1 = 3 * argu1; return result1; } var ok = triple(3); // on stocke le return dans une variable alert(ok); // on affiche la variable
Voici un exercice que vous pouvez réaliser : une mini-calculatrice, demandant deux nombres et affichant les résultats des 4 opérations “de base” (addition, …), en créant une fonction pour chaque opération (même si c'est inutile, c'est un entraînement).
Il est également possible d'améliorer et de compléter notre convertisseur.
Bref, plein de bonnes idées pour progresser.