Function

Le constructeur Function crée un nouvel objet Function. En JavaScript, chaque fonction est un objet Function.

Syntaxe

new Function ([arg1[, arg2[, ...argN]],] corpsFonction)

Paramètres

arg1, arg2, ... argN
Les noms utilisés par la fonction pour les arguments formellement déclarés. Chacun doit être une chaîne de caractères correspondant à un identifiant JavaScript valide (ou une liste de telles chaînes séparées par des virgules). Par exemple : "x", "uneValeur", ou "a,b".
corpsFonction
Une chaîne de caractères qui contient les instructions JavaScript définissant la fonction.

Description

Les objets Function créés avec le constructeur Function sont analysés quand la fonction est créée. Ceci est moins efficace que de déclarer une fonction grâce à une expression de fonction ou à une instruction function car celles crées de cette façon sont analysées avec le reste du code.

Tous les arguments passés à la fonction seront traités avec les noms des identifiants des paramètres de la fonction à créer, dans le même ordre dans lequel ils ont été passés.

Note : Les fonctions créées avec le constructeur Function ne créent pas de fermetures avec leurs contextes. Elles sont toujours créées dans la portée grlobal. Lorsqu'elles sont exécutées, elles ne pourront accéder qu'à leurs propres variables locales et aux variables globales et ne pourront pas accéder à celles de la portée dans laquelle le constructeur Function a été appelé. Le comportement obtenu est donc différent de celui obtenu avec eval dont le code contient une expression de fonction.

Appeler le constructeur Function comme une fonction (c'est-à-dire sans utiliser l'opérateur new) a le même effet que quand il est appelé comme constructor.

Propriétés et méthodes de Function

L'objet global Function ne possède pas de méthodes ou de propriétés propres. Cependant, il est lui-même une fonction et hérite de certaines méthodes et propriétés depuis Function.prototype grâce à la chaîne de prototype.

Le prototype de Function

Propriétés

Méthodes

Les instances de Function

Les instances de Function héritent des méthodes et propriétés de Function.prototype. Comme pour les autres constructeurs, il est possible de modifier le prototype du constructeur afin d'apporter des modifications à toutes les instances de Function.

Exemple

Définir des arguments avec le constructeur Function

Le code suivant permet de créer un objet Function qui utilise deux arguments :

// Cet exemple peut être lancé dans votre console JavaScript

// On crée un fonction qui prend deux arguments 
// et qui en renvoie la somme
var ajoute = new Function('a', 'b', 'return a + b');

// On appelle la fonction
ajoute(2, 6);
// > 8

Les arguments "a" et "b" sont les noms des arguments formellement déclarés utilisés dans le corps de la fonction : "return a + b".

Une fonction récursive pour massivement modifier le DOM

Créer des fonctions avec le constructeur Function permet de créer dynamiquement un nombre indéterminé d'objets avec un code exécutable dans la portée globale. L'exemple qui suit (qui consiste en une fonction récursive qui modifie le DOM) est impossible à faire à chaque nouvelle requête si on souhaite éviter les fermetures.

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Exemple MDN - Une fonction récursive qui modifie le DOM</title>
<script type="text/javascript">
var domQuery = (function() {
  var aDOMFunc = [
    Element.prototype.removeAttribute,
    Element.prototype.setAttribute,
    CSSStyleDeclaration.prototype.removeProperty,
    CSSStyleDeclaration.prototype.setProperty
  ];

  function setSomething(bStyle, sProp, sVal) {
    var bSet = Boolean(sVal), fAction = aDOMFunc[bSet | bStyle << 1],
        aArgs = Array.prototype.slice.call(arguments, 1, bSet ? 3 : 2),
        aNodeList = bStyle ? this.cssNodes : this.nodes;

    if (bSet && bStyle) { aArgs.push(''); }
    for (
      var nItem = 0, nLen = this.nodes.length;
      nItem < nLen;
      fAction.apply(aNodeList[nItem++], aArgs)
    );
    this.follow = setSomething.caller;
    return this;
  }

  function setStyles(sProp, sVal) { return setSomething.call(this, true, sProp, sVal); }
  function setAttribs(sProp, sVal) { return setSomething.call(this, false, sProp, sVal); }
  function getSelectors() { return this.selectors; };
  function getNodes() { return this.nodes; };

  return (function(sSelectors) {
    var oQuery = new Function('return arguments.callee.follow.apply(arguments.callee, arguments);');
    oQuery.selectors = sSelectors;
    oQuery.nodes = document.querySelectorAll(sSelectors);
    oQuery.cssNodes = Array.prototype.map.call(oQuery.nodes, function(oInlineCSS) { return oInlineCSS.style; });
    oQuery.attributes = setAttribs;
    oQuery.inlineStyle = setStyles;
    oQuery.follow = getNodes;
    oQuery.toString = getSelectors;
    oQuery.valueOf = getNodes;
    return oQuery;
  });
})();
</script>
</head>

<body>

<div class="testClass">Lorem ipsum</div>
<p>Some text</p>
<div class="testClass">dolor sit amet</div>

<script type="text/javascript">
domQuery('.testClass')
  .attributes('lang', 'en')('title', 'Risus abundat in ore stultorum')
  .inlineStyle('background-color', 'black')('color', 'white')('width', '100px')('height', '50px');
</script>
</body>

</html>

Spécifications

Spécification Statut Commentaires
ECMAScript 1st Edition (ECMA-262) Standard Définition initiale. Implémentée avec JavaScript 1.0.
ECMAScript 5.1 (ECMA-262)
La définition de 'Function' dans cette spécification.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Function' dans cette spécification.
Standard  

Compatibilité des navigateurs

Fonctionnalité Chrome Firefox (Gecko) Internet Explorer Opera Safari
Support simple (Oui) (Oui) (Oui) (Oui) (Oui)
Fonctionnalité Android Chrome pour Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Support simple (Oui) (Oui) (Oui) (Oui) (Oui) (Oui)

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs à cette page : SphinxKnight, darul75, teoli, tregagnon, LaBoumerde, Sheppy, rat, daniel35310
Dernière mise à jour par : SphinxKnight,