JavaScript : Paramètres et arguments des fonctions
#1 On fait le point sur le vocabulaire
Dans ma formation précédente "Les bases de JavaScript" j'ai parlé de paramètres de déclarations et de paramètres d'appels. Je l'ai fait, car ça me parait plus parlant, plus explicite. J'avais aussi donné un tableau dans lequel figuraient les trois principales façons d'appeler ces informations.
Dans cette nouvelle formation, je vais utiliser un vocabulaire plus classique. Je vais dire les paramètres pour les paramètres que l'on déclare au moment de la déclaration de la fonction et je vais dire les arguments pour les paramètres que l'on passe au moment de l'appel.
#2 Comment sont passés les arguments ?
Ca aussi, je l'avais dit et je le redis ici. Les arguments sont passés par copie dans une pile qu'on appelle la pile d'exécution. En fait, c'est une affectation. Peu importe que ce soient des variables contenant des valeurs primitives ou que ce soient des références.
Tous les langages qui supportent la récursivité fonctionnent de cette manière.
Il y a une différence de fonctionnement qui est liée au contenu de l'argument. Si c'est une valeur, elle sera utilisée localement dans la fonction. Si c'est une référence, le programmeur pourra modifier ce qui est pointé par la référence et qui peut se trouver en dehors de la fonction.
#3 Des valeurs par défaut pour les arguments
Ca c'est une nouveauté ES6 qui était attendue. JavaScript dispose enfin de valeurs par défaut pour ses arguments.
Dans le script ci-dessous, si vous ne mettez pas la valeur de c
au moment de l'appel, vous allez récupérer la valeur 1
. Il faut placer c
en dernier.
Si maintenant, vous voulez utiliser deux valeurs par défaut. Vous allez les mettre en dernier toutes les deux. Mais attention, si vous voulez utiliser l'avant-dernière, vous êtes obligé de prendre aussi la dernière et ainsi de suite.
Tester le codeVous pouvez utiliser une référence pour une valeur par défaut.
#4 Si il y a plus d'arguments que de paramètres ?
Dans ce cas, vous n'avez pas de paramètre pour récupérer les arguments qui sont en trop. Dans notre exemple, les arguments qui sont en trop sont "perdus", ils ne servent à rien. Ce qui ne veut pas dire qu'on ne peut pas les récupérer. On va voir comment plus loin.
Notez aussi qu'aucune erreur n'est déclenchée. D'autres langages vous auraient déclenché une erreur. D'une certaine manière, ils vous auraient dit : tu déclares deux paramètres et tu passes quatre arguments, c'est incohérent. Tu as fait une erreur de programmation.
Tester le code#5 Si il y a moins d'arguments que de paramètres ?
La valeur undefined
sera affectée aux arguments manquants. Ce qui peut bien sûr poser problème et déclencher une erreur. Dans notre exemple, on va se contenter d'afficher les valeurs.
#6 Le paramètre Rest
Vous pouvez récupérer les arguments qui sont en plus. Ils se trouvent dans un tableau spécifique que l'on appelle le paramètre Rest
(en français le paramètre du reste). Ce paramètre est une évolution ES6.
Avant la version ES6, il existait déjà le tableau de nom arguments
pour faire "à peu près" la même chose. Cependant, le paramètre Rest
est un vrai tableau de constructeur Array
, alors que arguments
est une simple "collection". On va aussi voir par la suite que le fonctionnement de arguments
diffère un peu.
On va reprendre notre exemple de l'addition que nous avons fait tout à l'heure. Ici, je vais récupérer toutes les valeurs qui seront passées en argument de manière à les ajouter.
Tester le codeNotez bien que vous n'êtes pas obligé de récupérer la totalité des arguments comme je l'ai fait ci-dessus. Vous pouvez spécifier des paramètres devant le paramètre Rest
mais pas derrière.
Ici, je vais par exemple spécifier un premier paramètre et ajouter ceux qui restent.
Tester le code#7 Le tableau arguments
On trouve encore beaucoup de code en 2020 qui utilise encore le tableau arguments
.
Etant donné que c'est une collection vous n'avez pas les méthodes d'un Array
, mais vous avez un attribut length
pour pouvoir le parcourir de manière traditionnelle avec une boucle for
.
Plusieurs spécificités :
arguments
est passé de manière implicite à toutes fonctions.arguments
contient la totalité des arguments même s'il y a des paramètres de spécifiés.arguments
est un alias des paramètres qui sont spécifiés. Cette caractéristique peut être bloquée par l'utilisation du mode strict.
Ci-dessous, un exemple avec un paramètre a
de spécifié. Dans la fonction, on affecte a
et on constate que arguments[0]
est, lui aussi, affecté. Dans l'autre sens, on aurait eu le même comportement. Un "use strict"
annule ce "comportement d'alias".