Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
Lorsqu'une séquence d'instructions doit être exécutée plusieurs fois il faut utiliser une fonction.
Tous les langages proposent des fonctions natives c'est à dire déjà définies, prêtes à l'emploi.
Dans tous les langages le développeur peut créer ses propres fonctions.
Nous avons déjà utilisé dans nos scripts des fonctions JavaScript natives suivantes :
alert(), prompt(), parseInt(), parseFloat(), etc.
Ces fonctions sont dites natives car elles sont déjà définies dans le langage. Aussi les appelle t-on également fonctions
prédéfinies.
Les fonctions citées sont natives & génériques car elles peuvent s'appliquer à différents types d'objets à la différence
des méthodes.
Une méthode est une fonction propre à un type d'objet.
Par exemple vous pouvez appliquer à un objet de type String les méthodes trim(), toUpperCase(), toLowerCase() etc.
(et seulement à une chaine).
Il existe aussi des méthodes pour les objets de type Date, de type Array, de type Map, de type Set, de type Document, etc.
J'ai consacré tout un chapitre sur les objets natifs de JS et leurs méthodes :
les objets natifs de JS
Tapez les commandes suivantes dans la console !
>unechaine =" aAbBcCdD " ' aAbBcCdD ' >typeof unechaine 'string' >unechaine.toLowerCase() ' aabbccdd ' >unechaine.toUpperCase() ' AABBCCDD ' >parseInt(100.25) 100 >parseInt("100.25") 100 >unnombre =1234.565789 1234.565789 >unnombre.trim() ... unnombre.trim is not a function
J'applique les méthodes .toUpperCase() & .toLowerCase() à un objet de type String : la variable "unechaine".
Notez la syntaxe : objetString.méthode(). C'est ce qu'on appelle la notation pointée.
Si je tente d'appliquer la méthode .trim() à un nombre, j'ai une erreur !
Par contre je peux appliquer la fonction générique ParseInt() à un nombre mais aussi à une chaine (si cette chaine
est au format numérique).
La syntaxe est alors différente : fonction(valeur).
typeof n'est pas une fonction mais un opérateur.
Pour chaque bouton on intègre un attribut événementiel. Par exemple : onclick = "fcouleur('green')
Ce qui veut dire que si vous cliquez sur ce bouton vous appelez la fonction fcouleur() avec passage d'une valeur : green.
Dans le script je déclare deux variables : titre et texte.
Pour cibler dans un script un élément HTML de la page j'utilise les nouvelles méthodes de l'objet document : querySelector() & querySelectorAll(). Ces deux méthodes acceptent comme argument un sélecteur CSS.
Notre code est tout à fait correct mais présente un inconvénient majeur : le code JS est mélangé avec le code HTML.
Non seulement je vais utiliser des fonctons anonymes mais de plus je vais centralisé le JS dans le script.
En effet la détection des évènements va se faire dans le script (et non plus via le HTML).
En d'autres termes je vais abandonner le gestionnaire d'évènements HTML pour le gestionnaire d'évènements JS.
Plus aucune trace de JS dans le code HTML. Par contre j'ai affecté à chaque élément button un ID ; ID qui sera utilisé dans le script ...
let titre = document.querySelector('h1') ; let texte = document.querySelector('p') ; document.querySelector('#vert').onclick = function() { titre.style.color = 'green'; texte.style.color = 'green'; } document.querySelector('#rouge').onclick = function() { titre.style.color = 'red'; texte.style.color = 'red'; } document.querySelector('#bleu').onclick = function() { titre.style.color = 'blue'; texte.style.color = 'blue'; }
J'utilise désormais le gestionnaire d'évènements de JS (et non plus le gestionnaire d'évènements HTML).
Ainsi tout le code JS est centralisé dans le script et plus aucun 'scorie' JS dans le code HTML.
Pour en savoir plus sur la gestion des évènements en JS : Les évènements
Étudions plus en détail la première fonction anonyme !
Vous pouvez trouver que le script précédent est un peu lourd.
Il le serait davantage si au lieu de modifier l'aspect de deux éléments HTML il s'agit d'en modifier 4 ...
Il serait plus logique que chaque fonction anonyme appelle à son tour une fonction nommée.
Il y désormais un titre et trois éléments de type P. Donc le script doit modifier désormais le DOM pour 4 éléments (et non plus 2) !
function changer_couleur(couleur) { document.querySelector('h1').style.color = couleur ; document.querySelector('p').style.color = couleur; document.querySelectorAll('p')[1].style.color = couleur ; document.querySelectorAll('p')[2].style.color = couleur ; } // fin fonction // appel de la fonction changer_couleur via des fonctions anonymes : document.querySelector('#vert').onclick = function() {changer_couleur('green'); } document.querySelector('#rouge').onclick = function() {changer_couleur('red');} document.querySelector('#bleu').onclick = function() {changer_couleur('blue'); }
Chaque fonction anonyme consiste à appeler la fonction nommée "changer_couleur()" avec passage en argument de la couleur retenue.
Une fonction peut retourner un tableau indicé de valeurs.
function mon_script() { function fcercle(rayon) { let aire = Math.round(rayon * rayon * 3.14); let circonference = Math.round(rayon * 2 * 3.14) ; let tab =[aire, circonference]; return tab; // retourne un tableau de 2 éléments } let rayon =parseInt(prompt("saisir le rayon du cercle !")); let tableau =fcercle(rayon); //appel de la fonction fcercle document.write("aire : " + tableau[0]); document.write("circonférence : " + tableau[1]); } // fin mon_script
La fonction fcercle() retourne deux valeurs sous forme d'un tableau indicé (objet Array) nommé "tab".
Donc lors de l'appel de fonction la variable d'affectation "tableau" est un tableau avec deux éléments.
Le premier élément contient l'aire et le deuxième la circonférence.
Math.round(expression) : méthode de l'objet Math pour arrondir à l'entier le plus proche.
Nous voulons créer une fonction qui cumule un nombre variable d'entiers : 2 ou 3 ou 4 ou 5 ou n ... Donc le nombre d'arguments à saisir lors de l'appel de la fonction est variable.
function mon_script() { function fsomme(...tab) { let cumul = 0; for (let i in tab) {cumul+=tab[i] } ; return cumul; } // fin fsomme // appels fonction let cumul1 = fsomme(10,10,30); let cumul2 = fsomme(1,2,3,4); let cumul3 = fsomme(1000, 2000); console.log(cumul1); console.log(cumul2); console.log(cumul3); } // fin mon_script
Dans cette fonction "tab" est un tableau indicé.
Dans la parenthèse le nom du tableau doit être précédé de trois points.
Emploi de la syntaxe simplifiée "for ... in" pour parcourir le tableau.
Notez les différents appels de la fonction avec 3 puis 4 et enfin 2 arguments.
La page se contente d'afficher "affichez la console !".
Pour ouvrir la console : clic droit sur l'iframe puis sélectionnez "inspecter" puis
onglet "console".
Vous voyez apparaitre : 50 puis 10 puis 3000.
Avec la dernière version de ECMAScript, il est possible de définir des fonctions avec une syntaxe très simple.
Objectif : créer la fonction qui fait la sommme de deux nombres et multiplie le tout par un troisième nombre.
function mon_script() { let x =10, y = 12, z = 13; w = 14; // ci-dessous fonction nommmée standard let fstandard = function(n1,n2,n3) { return (n1 + n2) * n3; }; // fonction anonyme fléchée let fflechee = (n1,n2,n3) => (n1 + n2) * n3; alert("appel fonction standard : " + fstandard(x,y,z)); alert(`appel fonction fléchée : ${fflechee(y,z,w)} `); } // fin mon_script
Les fonctions fstandard & fflechee font exactement la même chose.
La première a une syntaxe standard alors que la seconde a un syntaxe simplifiée dite "fléchée".
Dans cette syntaxe simplifiée le mot "function" disparait ; le mot "return" est remplacé par une flèche d'où l'expression
"fonction fléchée".
La définition de la fonction fléchée tient en une seule instruction : l'intérêt est là !
Quant à l'appel d'une fonction fléchée, il n'y a aucune différence par rapport à une fonction standard.
Notez que je peux utiliser la syntaxe "template strings" pour appeler une fonction : deuxième instruction alert()