Accueil

Traduction

Tutoriel sur JS natif, Vue.js, jQuery.js & Node.js

Tutoriel JavaScript - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

JavaScript : les fonctions

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.
Grâce aux dernières versions de EMCAScript il est possible de créer des fonctions avec un nombre variable d'arguments, retournant plusieurs valeurs et écrites dans une syntaxe simplifiée.

Les fonctions natives de JavaScript

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.

Vous savez que pour utiliser une fonction (on dit appeler une fonction) il faut lui passer un argument car il s'agit de fonctions avec un paramètre.
Exemple : pour appeler la fonction native alert() il faut passer en argument une expression (mais une seule) plus ou moins complexe.
On peut ainsi écrire l'instruction : alert(12*12 + 1000). La fonction retournera le résultat de ce calcul : 1144 (multiplication effectuée avant l'addition).
Il faut aussi respecter la casse dans le libellé de la fonction sinon il y aura "plantage". Ainsi si vous écrivez isnan('bonjour') la console affichera le message : "isnan is not defined" ; la bonne syntaxe est isNaN().

La fonction confirm()

Parmi les fonctions natives il y a la fonction confirm Cette fonction permet de saisir une valeur logique c'est à dire TRUE ou FALSE.

Le code de la partie BODY :

Le rendu du script :

Actualisez la page pour une nouvelle exécution du script.

Comme avec la fonction prompt une boîte de dialogue s'affiche mais avec deux boutons OK et Annuler et en légende l'argument de la fonction.
Donc si vous cliquez sur OK vous saisissez TRUE et si vous cliquez sur le bouton Annuler vous saisissez FALSE.

Comme la variable vmajeur contient une booléen (ou valeur logique) on peut simplifier la syntaxe et écrire :
vmajeur au lieu de vmajeur == true
!vmajeur (un point d'exclamation qui veut NOT) au lieu de vmajeur == false

La fonction IsNaN() et son inverse

isNaN veut dire "isNotaNumber". Attention à la casse pour cette fonction native : les deux N sont en majuscule.
Cette fonction native retourne true si la valeur testée n'est pas au format numérique.
L'inverse de cette fonction est !isNaN (lire "NotIsNotaNumber") qui retourne true si la valeur testée est au format numérique.
Je veux dire par format numérique une suite de chiffres séparés par un point éventuel (séparateur décimal).

La fonction isNumber() n'existe pas !

Code de l'exemple (extrait) :

Le rendu du script :

Saisir d'abord 12OO (erreur de frappe) puis 12,5 puis 12.5
Actualisez la page pour une nouvelle exécution du script.

Fonctions génériques et méthodes

La plupart des fonctions natives de JS sont spécifiques à un type d'objet ; on parle plus précisèment de méthodes.

Cependant certaines méthodes peuvent être communes à plusieurs classes d'objets.
Exemple : la méthode indexOf() peut s'appliquer à une chaine (string) mais aussi à un tableau indicé (array).

Liste des fonctions et méthodes

Les fonctions génériques sont peu nombreuses. Par contre il est quasi impossible de citer la multitude de méthodes. De plus chaque version de JS s'enrichit de nouvelles méthodes.
Liste des fonctions génériques et méthodes de JS

Intérêt des méthodes

Les méthodes facilitent grandement le travail du développeur web. Avant de vous lancer dans l'écriture d'une fonction personnelle, vérifiez s'il n'existe pas déjà une méthode prédéfinie qui fera l'affaire.
Chaque nouvelle version de JS s'enrichit de nouvelles méthodes. Ainsi la liste citée en lien ne mentionne pas les méthodes filter(), map(), forEach(), etc. applicables à un tableau car apparues avec la dernière version de JS.

Créez ses propres fonctions

Le nombre de fonctions génériques et méthodes ne couvre pas tous les besoins.
Donc un script contient souvent une partie dans laquelle on définit ses propres fonctions puis une partie dans laquelle on fait appel à ces fonctions.

Si vous souhaitez utiliser vos fonctions personnelles dans différentes pages, vous pouvez bien sûr créer un fichier de fonctions : un fichier d'extension .js. C'est d'ailleurs le principe de certaines librairies JS célèbres ...

Fonctions personnelles - niveau 1

Il s'agit d'une fonction personnelle basique car il n'y a pas de paramètre à passer (un argument lors de son appel) et cette fonction ne retourne pas de valeur.
Objet de cette fonction basique : calculer la surface d'un cercle de 2 cm de rayon.

Le script

Le script comprend deux parties :

Pour définir une fonction il faut utiliser le mot réservé function suivi du nom que vous donnez à cette fonction.
Ici il s'agit d'une fonction basique qui se nomme fsurface_cercle.
Les instructions de la fonction sont délimitées par une paire d'accolades.
Cette fonction calcule la surface d'un cercle de rayon 2cm. Il n'y a donc pas d'argument à passer.

Testez ce script dans un nouvel onglet !

Dans le programme principal on appelle deux fois la fonction.
Puis on demande le type de "f_cercle" ; la réponse est "function". Une fonction est en fait une variable de type function.
Puis on demande d'afficher la variable vrayon ; la console affiche le message d'erreur : "vrayon is not defined". En effet vrayon est une variable créée dans le cadre de la fonction donc elle est inconnue du programme principal.

Toute variable déclarée dans le cadre d'une fonction n'est utilisable qu'au sein de cette fonction. On dit que la variable est locale.
Donc dans l'exemple f_cercle est une variable globale et vrayon est une variable locale.

Je rappelle que pour afficher la console du navigateur, il faut faire un clic droit dans l'onglet et sélectionner "inspecter".

Fonctions personnelles - niveau 2

La fonction de l'exemple précédent était d'un usage des plus limité : calcul de la surface d'un cercle de rayon 2 unités (cm ou mètre ou ...)
Nous allons maintenant définir et utiliser une fonction capable de calculer la surface d'un cercle indépendamment de son rayon et unité de mesure.
C'est possible mais alors il faut alors créer une fonction personnelle avec paramètres c'est à dire passage d'arguments lors de son appel.

Le script

Attention j'ai écrit ce script en JS moderne conformément avec la version 6.
Notez bien l'argument de la fonction alert() : `surface du cercle ${surface} ${unite} carrés`.
J'ai donc utilisé (pour éviter une concaténation fastidieuse) la notation "template strings" ou "littéraux de gabarit".
Pour en savoir davantage sur les littéraux de gabarit

Testez ce script !

Cette fonction nommée fsurface_cercle calcule la surface d'un cercle quelque soit son rayon et l'unité de mesure (cm ou dm ou décimètre, ...).
Il s'agit donc d'une fonction avec deux paramètres. Donc pour appeler cette fonction il faut indiquer en parenthèses deux arguments.

Fonction personnelle - niveau 3

Vous savez que les fonctions natives sont paramétrables mais de plus retournent une valeur. Nous allons tenter de créer une fonction personelles ayant les mêmes propriétés.
Pour qu'une fonction retourne une valeur (vers le programme principal) il faut que dans sa définition celle-ci comporte l'instruction return suivie de la valeur à retourner.

Exemple de fonction personnelle retournant une valeur

Le script :

La fonction se nomme fpuissance2 et exige le passage d'un argument lors de son appel.

Au lieu d'écrire function fpuissance2(nombre) j'ai écrit var fpuissance2 = function(nombre).
Ce qui montre qu'une fonction est en fait une forme particulière de variable.
La dernière instruction retourne "function" !

Testez ce script !

La fonction nommée fpuissance2 calcule le carré d'un nombre, n'affiche rien mais retourne une valeur. Donc l'appel de cette fonction dans le programme principal affiche la valeur retournée.
Dans le programme principal j'appelle deux fois la fonction "fpuissance2".

Appel de fonction avec en argument le mot "this"

L'argument passé lors de l'appel d'une fonction peut être le mot réservé this qui désigne l'objet courant.

Thème : script donnant des infos sur les images de la page : source et texte alternatif.

Le code HTML

Notez bien la syntaxe : ... onclick ='fafficher(this)' ...

this est un mot réservé de JS très pratique. Il désigne l'élément HTML courant (la cible de la manipulation).

Attention pour qu'une fonction s'applique à l'élément HTML courant il faut employer le mot magique "this" comme argument lors de l'appel de la fonction mais jamais comme paramètre dans la définition de la fonction.
Le nom du paramètre pour la description est toujours libre. Ici j'emploie le terme image puisque la fonction s'applique toujours à un élément IMG.

Le script

Notez l'emploi de la notation "template strings".

Le rendu dans un Iframe

Si je clique sur la première image j'ai des infos sur celle-ci : valeurs des attributs src & alt.
Si je clique sur la deuxième image j'ai les mêmes infos pour la deuxième image.

Les fonctions anonymes

Sachez qu'il existe des fonctions anonymes.
Dans une même bloc on décrit et on appelle la fonction. Une fonction anonyme ne peut être utilisée qu'une fois.
La syntaxe d'une fonction anonyme sur un évènement est la suivante:

Thèmatique : nous voulons que le visiteur de la page puisse modifier la couleur du texte.

Solution traditionnelle : emploi d'une fonction nommée

Le rendu du script dans un Iframe

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.

Solution moderne : avec des fonctions anonymes

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.

Le code HTML

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 ...

Le script

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 !

Le rendu dans un Iframe

Solution définitive

Vous pouvez trouver que le script précédent est un peu lourd.
Il le sera 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.

Le code HTML

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) !

Le script

Chaque fonction anonyme consiste à appeler la fonction nommée "changer_couleur()" avec passage en argument de la couleur retenue.

Le rendu dans un Iframe

Fonctions particulières

Fonctions qui retournent plusieurs valeurs

Une fonction peut retourner plusieurs valeurs sous forme d'un "array".

Le 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.

Testez ce script dans un nouvel onglet

Les tableaux indicés en JS (les objets "list" en Python) sont traités dans le chapitre suivant.

Fonction avec un nombre variable de paramètres

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.

Le 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.

Rendu du script dans un nouvel onglet !

La page se contente d'afficher "affichez la console !".
Pour ouvrir la console : clic droit sur la page puis sélectionnez "inspecter" puis onglet "console".

Vous voyez apparaitre : 50 puis 10 puis 3000.

Fonctions fléchées

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.

Le 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 !
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()

Rendu du script dans un onglet !