close

JavaScript : Paramètres et arguments des fonctions

#1 On fait le point sur le vocabulaire open

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 ? open

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 open

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.

Tester le code

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 code

Vous pouvez utiliser une référence pour une valeur par défaut.

#4 Si il y a plus d'arguments que de paramètres ? open

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 ? open

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.

Tester le code

#6 Le paramètre Rest open

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 code

Notez 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 open

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 :

  1. arguments est passé de manière implicite à toutes fonctions.
  2. arguments contient la totalité des arguments même s'il y a des paramètres de spécifiés.
  3. 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.
Tester le code

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

Tester le code