Appel et retour de fonctions en Javascript

Nous avons vu, dans le premier article de notre série consacrée aux fonctions en Javascript, que l’appel d’une fonction se fait par son identifiant suivi impérativement de parenthèses, lesquelles peuvent contenir les arguments à faire passer. Sans ces parenthèses, la fonction, qui est contenue dans une variable, n’est pas évaluée.

Par défaut, une fonction retourne undefined, sauf si, bien sûr, une valeur est retournée de manière explicite grâce à l’opérateur return.

L’utilisation de l’opérateur typeof confirme cela.

Appel dynamique

Il est très facile d’appeler dynamiquement une méthode, puisqu’un attribut d’objet est accessible par la notation entre crochets. La valeur que l’on passe entre les crochets est évaluée et associée au nom d’un attribut.

En mode non strict, il est possible d’appeler de la même manière une fonction depuis l’Object Global, ce qui nécessite toutefois de connaître ce dernier en fonction du contexte d’exécution.

Mais mieux vaut éviter l’objet global. De plus, cette technique ne fonctionne plus en mode strict, ce qui démontre qu’elle n’est pas optimale du tout. Sur ce sujet, je vous recommande mon article sur le contexte.

Il existe une autre possibilité qui consiste à utiliser eval avec le nom de la fonction comme paramètre, suivi par les parenthèses et les éventuels arguments.

Quoique les eval n’ont pas non plus très bonne réputation…

Call, apply et bind

Une fonction peut également être appelée de manière indirecte, via les méthodes natives de Function, telles que call, apply ou bind, dont j’explique le fonctionnement à nouveau dans mon article sur le contexte.

Apply est une méthode particulièrement intéressante car elle permet d’appeler une fonction en lui passant des arguments sous forme d’un tableau, à l’instar de call_user_func_array en PHP.

L’exemple précédent met également en avant la possibilité d’associer des méthodes (abs) à des fonctions (sum).

Getter et setter

Nous savons qu’une méthode n’est rien d’autre qu’une fonction associée à un objet. Toutefois, certaines méthodes bénéficient d’un appel particulier, grâce aux mots-clés get et set, disponibles uniquement en ECMAScript 5. Ces deux mots-clés permettent d’appeler des getter et setter comme s’il s’agissait d’un simple attribut.

Constructeur

Le mot-clé new peut être passé soit devant la définition de la fonction, soit devant son appel, ce qui, dans tous les cas, a pour effet d’instancier un nouvel objet.

L’objet ainsi créé ne peut plus être utilisé comme fonction mais possède toujours un accès à la fonction initiale via sa propriété constructor.

Une même fonction peut donc être appelée sous deux formes, l’une comme simple fonction, l’autre comme constructeur, offrant alors un comportement distinct en deux points.

Premièrement, l’instanciation de la fonction a pour effet d’attacher l’objet au mot-clé this accessible à l’intérieur de la fonction, comme expliqué dans mon article sur le contexte.

Par ailleurs, une fonction utilisée comme constructeur retourne this de manière implicite.

Retourner explicitement this est possible, mais ne change rien si on instancie la fonction. La différence est au niveau de l’appel de fonction qui retournera l’objet global plutôt que undefined. Du coup, je pense qu’il ne s’agit pas d’une bonne pratique.

On peut également retourner explicitement un objet. Cette technique est parfois utilisée pour garantir le retour d’un objet également dans le cas de l’appel de fonction. L’instanciation n’est plus obligatoire. Toutefois, le problème est qu’on ne travaille plus avec une instance de la fonction, et l’accès à son prototype n’est plus possible.

Enfin, dans certains cas, si la valeur n’est pas un objet, this est retourné malgré tout…

Conclusion

Javascript offre l’ensemble des outils nécessaires à l’appel de fonctions: appel dynamique, appel via tableau d’arguments, appel avec redéfinition du contexte, getter et setter,…

Mais là où il faut faire attention, c’est que la déclaration d’une classe passe aussi par la déclaration d’une fonction, si bien qu’une même fonction peut être utilisée dans deux contextes totalement différents, l’un objet et l’autre non, avec un comportement a priori non compatible.

Dans notre prochain article nous verrons comment les arguments peuvent être utilisés de manière tout aussi dynamique.

3 réflexions au sujet de « Appel et retour de fonctions en Javascript »

  1. Ping : Les fonctions en Javascript | The Dark Side Of The Web

  2. « Il est donc inutile, voire même déconseillé, de déclarer un retour explicite dans une telle fonction, qui, par défaut, retourne de toute façon toujours this. »

    Il peut être utile de retourner autre chose (que this) : un objet en l’occurence dont certaines propriétés sont « privatisées ».

    • comme ceci?

      function foo(){
      return {bar: ‘bar’};
      }
      console.debug(foo()); //Object { bar= »bar »}
      console.debug(new foo()); //Object { bar= »bar »}

      Quel est alors l’intérêt du new?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>