Chapitre 3 : Fonctions
1 min de lecture
Chapitre 3 : Fonctions
Objectif
À la fin de ce chapitre, la phrase n’est plus rédigée dans le clic. Une fonction reçoit le prénom, le nombre d’essais et la limite, puis elle renvoie le texte. Le clic compte, appelle cette fonction, et place le résultat dans le paragraphe. Vous l’appelez aussi depuis la console, avec d’autres valeurs, sans recopier le if. Le dossier premiere-page reste en place.
Reprendre le dossier
Ouvrez premiere-page. index.html est celui du chapitre 2 : le paragraphe porte id="message", le bouton porte id="action" et affiche « Nouvel essai », la balise script est en bas de body.
script.js choisit encore la phrase à l’intérieur du clic. Rechargez, cliquez une fois : « Aina, essai 1 sur 3. » Le programme marche, mais compter, comparer et rédiger vivent dans le même bloc. Pour changer une virgule, il faut la chercher dans le clic. Pour lire la phrase de l’essai 3 sans cliquer trois fois, aucun nom ne répond.
Ce chapitre sort la rédaction de ce bloc. Le compteur et la session restent dans le clic.
Écrire la fonction une fois
Une fonction est un bloc nommé. On l’écrit une fois, on l’appelle par son nom. Le mot function annonce la déclaration. Le nom suit, puis les paramètres entre parenthèses, puis le corps entre accolades. Remplacez tout script.js par ceci. Enregistrez, rechargez, ouvrez la console.
function phraseEssai(personne, nombre, maximum) {
if (nombre < maximum) {
return personne + ", essai " + nombre + " sur " + maximum + ".";
} else if (nombre === maximum) {
return personne + ", dernier essai.";
} else {
return "Limite dépassée.";
}
}
console.log(phraseEssai("Aina", 1, 3));
console.log(phraseEssai("Aina", 3, 3));
console.log(phraseEssai("Ravo", 4, 3));
La console affiche « Aina, essai 1 sur 3. », « Aina, dernier essai. », puis « Limite dépassée. » Le if du chapitre 2 n’est écrit qu’une fois. Les trois appels passent dessous, chacun avec ses valeurs.
Ce fichier ne touche pas au paragraphe. phraseEssai fabrique un texte, console.log le montre. On vérifie la réponse avant de l’afficher. Le nom dit ce qu’elle rend. faire ou f obligerait à relire le corps.
Paramètres, arguments, valeur renvoyée
Les noms entre parenthèses, à la déclaration, sont les paramètres : des emplacements. Les valeurs entre parenthèses, à l’appel, sont les arguments. Elles remplissent les emplacements dans l’ordre. phraseEssai("Aina", 1, 3) place "Aina" dans personne, 1 dans nombre et 3 dans maximum. Le troisième appel place "Ravo" et 4. Le corps ne change pas. Seuls les arguments changent, donc la phrase change.
return quitte la fonction et remet une valeur à l’endroit de l’appel. console.log la reçoit. Sans return, JavaScript fournit undefined. Retirez le return de la première branche, rechargez : la première ligne devient undefined, les deux autres restent. Remettez-le. Un seul return part : dès que la branche « inférieur » est prise, le reste ne tourne pas.
Les paramètres n’existent qu’entre les accolades. Sous les appels, console.log(personne) stoppe la console : ce nom est introuvable ici. Dehors, le prénom s’appellera prenom. La valeur passe d’un nom à l’autre à l’appel. Ces paramètres diffèrent des noms du clic, pour ne pas confondre la valeur reçue avec le compteur.
Le nombre reçu est une copie. nombre = nombre + 1 dans la fonction changerait cette copie, pas la variable qui a fourni l’argument. Un essai dans la console ne fait pas monter le compteur. Seul le clic ajoutera 1.
L’appel a besoin des parenthèses. phraseEssai seul désigne la fonction. phraseEssai("Aina", 1, 3) l’exécute. Sans parenthèses, la page peut afficher le code de la fonction, parce qu’on lui a donné la fonction au lieu du texte renvoyé.
Le clic appelle
Remettez les trois return. Remplacez tout script.js par le programme suivant.
const message = document.getElementById("message");
const bouton = document.getElementById("action");
const prenom = "Aina";
let tentatives = 0;
const sessionOuverte = true;
const limite = 3;
function phraseEssai(personne, nombre, maximum) {
if (nombre < maximum) {
return personne + ", essai " + nombre + " sur " + maximum + ".";
} else if (nombre === maximum) {
return personne + ", dernier essai.";
} else {
return "Limite dépassée.";
}
}
bouton.addEventListener("click", function () {
if (sessionOuverte === false) {
message.textContent = "Connectez-vous pour continuer.";
} else {
tentatives = tentatives + 1;
message.textContent = phraseEssai(prenom, tentatives, limite);
}
});
La fonction passée à addEventListener n’a pas de nom. Le navigateur l’appelle à chaque clic, comme au chapitre 1. On ne peut pas la retaper dans la console. phraseEssai, elle, est nommée : après le rechargement, phraseEssai("Aina", 2, 3) répond dans la console, et le paragraphe ne change pas.
L’addition vient avant l’appel. phraseEssai reçoit le compteur déjà augmenté. Passer encore 0 répondrait « Aina, essai 0 sur 3. » Le premier clic affiche l’essai 1, le troisième « Aina, dernier essai. », le quatrième « Limite dépassée. » Rechargez : tentatives repart de zéro.
Passez sessionOuverte à false, rechargez, cliquez. Le clic n’entre pas dans le else, n’appelle pas phraseEssai, et le compteur reste à 0. La phrase de connexion reste écrite sur place : une fonction suffit aujourd’hui. Remettez true.
phraseEssai ne contient pas message.textContent. La console l’essaie sans afficher, le bouton affiche sans réécrire le if.
Si le résultat surprend
- Le paragraphe affiche
undefined. Lereturnmanque sur la branche prise. Dans la console, appelezphraseEssai(prenom, tentatives, limite)avec les mêmes valeurs que le clic. - Le paragraphe affiche le code de
phraseEssai. Les parenthèses de l’appel manquent. ÉcrivezphraseEssai(prenom, tentatives, limite). - « Dernier essai » n’arrive pas.
maximuma reçu le texte"3".3 === "3"est faux, comme au chapitre 2. Passez le nombre3. - Chaque clic avance de deux.
tentatives = tentatives + 1est écrit dans la fonction et dans le clic. Gardez l’addition dans le clic seulement. phraseEssai()sans argument affiche « undefined, dernier essai. » Les paramètres manquants valentundefined, etundefined === undefinedest vrai : la branche « égal » part, avec un prénom absent. Passez les trois arguments, dans l’ordre.
Exercice
Restez dans premiere-page.
- Dans la console, appelez
phraseEssai("Aina", 1, 3),phraseEssai("Aina", 3, 3)etphraseEssai("Ravo", 4, 3). Notez les trois phrases. - Changez
"Aina"dansprenom, sans ouvrir leif. Rechargez, cliquez. La phrase suit le nouveau prénom. - Le bouton en est à l’essai 1. Appelez
phraseEssai(prenom, 2, limite)dans la console. Le paragraphe et le compteur restent où ils étaient. - Retirez le
returnde la branche « dernier essai ». Cliquez trois fois, lisezundefined, puis remettez lereturn. - Passez
limiteau texte"3". Le troisième clic ne dit plus « dernier essai ». Remettez le nombre3.
C’est réussi quand vous nommez, pour la phrase affichée, l’argument devenu personne, l’argument devenu nombre, et la ligne return qui a fourni le texte.
À retenir
functionsuivi d’un nom écrit le geste une seule fois. Le nom suivi de parenthèses l’exécute.- Les arguments remplissent les paramètres dans l’ordre. Le corps ne se recopie pas.
returnremet la valeur à l’appelant. Sansreturn, le résultat estundefined.phraseEssaine modifie ni le paragraphe nitentatives. Le clic compte, appelle, puis affiche.- Un paramètre n’existe que dans la fonction. Le nombre reçu est une copie.
La suite
Un prénom et un compteur tiennent chacun dans un nom. Plusieurs personnes, ou plusieurs phrases déjà obtenues, ne tiennent plus ainsi. Le chapitre 4, « Tableaux et objets », range des valeurs dans une liste, puis groupe le prénom, le nombre d’essais et la limite. phraseEssai recevra encore ces valeurs, lues dans ce groupe. Gardez premiere-page.