| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Function/Function | [Back] [Original] |
Get to know MDN better
Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.
Cette fonctionnalit est bien tablie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2015.
Attention : Les arguments passs ce constructeur sont analyss dynamiquement et excuts comme du JavaScript. Les API de ce type sont appeles points d'injection et peuvent constituer un vecteur d'attaques de type injection de scripts inter-sites (XSS).
Vous pouvez attnuer ce risque en passant toujours des objets TrustedScript au lieu de chanes de caractres et en imposant des types de confiance.
Voir Considrations de scurit pour plus d'informations.
Le constructeur Function() cre des objets Function. Appeler ce constructeur directement permet de crer des fonctions dynamiquement, mais prsente des problmes de scurit et des problmes de performance similaires (mais bien moins importants) ceux de eval(). Cependant, contrairement eval (qui peut avoir accs la porte locale), le constructeur Function cre des fonctions qui s'excutent uniquement dans la porte globale.
const sum = new Function("a", "b", "return a + b");
console.log(sum(2, 6));
// Rsultat attendu : 8
new Function(functionBody)
new Function(arg1, functionBody)
new Function(arg1, arg2, functionBody)
new Function(arg1, arg2, /* , */ argN, functionBody)
Function(functionBody)
Function(arg1, functionBody)
Function(arg1, arg2, functionBody)
Function(arg1, arg2, /* , */ argN, functionBody)
Note :
Function() peut tre appele avec ou sans new. Les deux crent une nouvelle instance de Function.
arg1, , argN FacultatifInstances de TrustedScript ou chanes de caractres dfinissant les noms utiliser par la fonction comme noms formels d'arguments. La valeur doit correspondre un paramtre JavaScript valide (soit un identifiant, un paramtre du reste, ou un paramtre dstructur, ventuellement avec une valeur par dfaut), ou une liste de telles chanes de caractres spares par des virgules.
Comme les paramtres sont analyss de la mme faon que les expressions de fonction, les espaces et les commentaires sont accepts. Par exemple : "x", "laValeur = 42", "[a, b] /* nombres */" ou "x, laValeur = 42, [a, b] /* nombres */". ("x, laValeur = 42", "[a, b]" est aussi correct, mais trs difficile lire.)
functionBodyUn TrustedScript ou une chane de caractres contenant les instructions JavaScript qui forment la dfinition de la fonction.
SyntaxErrorLes arguments des paramtres de la fonction ne peuvent pas tre analyss comme une liste de paramtres valide, ou le functionBody ne peut pas tre analys comme des instructions JavaScript valides.
TypeErrorUn paramtre est une chane de caractres lorsque les types de confiance sont imposs par une CSP et qu'aucune politique par dfaut n'est dfinie.
Ceci est observable en appelant la mthode toString() de la fonction.
Cependant, contrairement aux expressions de fonction normales, le nom anonymous n'est pas ajout la porte de functionBody, car functionBody n'a accs qu' la porte globale. Si functionBody n'est pas en mode strict (le corps doit lui-mme contenir la directive "use strict", car il n'hrite pas du mode strict du contexte), vous pouvez utiliser arguments.callee pour rfrencer la fonction elle-mme. Sinon, vous pouvez dfinir la partie rcursive comme une fonction interne :
const recursiveFn = new Function(
"count",
`
(function recursiveFn(count) {
if (count < 0) {
return;
}
console.log(count);
recursiveFn(count - 1);
})(count);
`,
);
Notez que les deux parties dynamiques de la source assemble la liste des paramtres args.join(",") et functionBody sont d'abord analyses sparment pour s'assurer qu'elles sont chacune syntaxiquement valides. Cela empche les tentatives d'injection.
new Function("/*", "*/) {");
// SyntaxError: Unexpected end of arg string
// Ne devient pas "function anonymous(/*) {*/) {}"
La mthode peut tre utilise pour excuter une entre arbitraire passe n'importe quel paramtre. Si l'entre est une chane de caractres potentiellement non scurise fournie par une utilisateurice, cela constitue un vecteur possible d'attaques par injection de scripts intersites (XSS). Par exemple, l'exemple suivant suppose que untrustedCode a t fourni par une utilisateurice :
const untrustedCode = "alert('Code potentiellement malveillant !');";
const adder = new Function("a", "b", untrustedCode);
Les sites web avec une politique de scurit du contenu (CSP) qui dfinit script-src ou default-src empchent par dfaut l'excution de ce type de code. Si vous devez autoriser l'excution de scripts avec Function(), vous pouvez attnuer ces problmes en passant toujours des objets TrustedScript au lieu de chanes de caractres, et en imposant des types de confiance l'aide de la directive CSP require-trusted-types-for. Cela garantit que l'entre passe par une fonction de transformation.
Pour autoriser l'excution de Function(), vous devez galement dfinir le mot-cl trusted-types-eval dans la directive script-src de votre CSP. Le mot-cl unsafe-eval autorise aussi Function(), mais il est beaucoup moins sr que trusted-types-eval, car il permet l'excution mme sur les navigateurs qui ne prennent pas en charge les types de confiance.
Par exemple, la CSP requise pour votre site peut ressembler ceci :
Content-Security-Policy: require-trusted-types-for 'script'; script-src '<votre_listeautorisante>' 'trusted-types-eval'
Le comportement de la fonction de transformation dpend du cas d'utilisation spcifique qui ncessite un script fourni par une utilisateurice. Si possible, vous devez limiter les scripts autoriss exactement au code que vous jugez fiable. Si cela n'est pas possible, vous pouvez autoriser ou bloquer l'utilisation de certaines fonctions dans la chane de caractres fournie.
Notez que ces exemples omettent l'utilisation des types de confiance pour plus de clart. Pour un exemple de la mthode recommande, voir Utiliser TrustedScript dans eval().
Function()Le code qui suit cre un objet Function qui prend deux arguments.
// Exemple excutable directement dans votre console JavaScript
// Crez une fonction qui prend deux arguments et retourne la somme de ces arguments
const additionneur = new Function("a", "b", "return a + b");
// Appeler la fonction
additionneur(2, 6);
// 8
Les arguments "a" et "b" sont les noms formels des arguments utiliss dans le corps de la fonction : "return a + b".
// Le constructeur Function() peut prendre plusieurs instructions spares par des points-virgules.
// Une expression de fonction doit contenir une instruction return avec le nom de la fonction.
// On peut voir ici que le rsultat de new Function est appel.
// Ainsi, on peut invoquer juste aprs la fonction qui vient d'tre cre.
const sommeTableau = new Function(
"const sommeTableau = (arr) => arr.reduce((precedente, courante) => precedente + courante); return sommeTableau",
)();
// On appelle la fonction
sommeTableau([1, 2, 3, 4]);
// 10
// Si on n'appelle pas new Function au moment de la cration,
// on peut toujours utiliser la mthode Function.call() ensuite
const plusGrandNombre = new Function(
"function plusGrandNombre (arr) { return Math.max(...arr) }; return plusGrandNombre",
);
// On appelle la fonction
plusGrandNombre.call({}).call({}, [2, 4, 1, 8, 5]);
// 8
// Une dclaration de fonction ne ncessite pas d'instruction return
const direCoucou = new Function(
"return function (nom) { return `Coucou, ${nom}` }",
)();
// On appelle la fonction
direCoucou("monde");
// Coucou, monde
| Spcification |
|---|
| ECMAScript 2027 LanguageSpecification # sec-function-constructor |
eval()functionfunctionCette page a t modifie le 1 aot 2026 par les contributeurices du MDN.
FunctionObject/FunctionObject.prototype.__defineGetter__()Object.prototype.__defineSetter__()Object.prototype.__lookupGetter__()Object.prototype.__lookupSetter__()Object.prototype.hasOwnProperty()Object.prototype.isPrototypeOf()Object.prototype.propertyIsEnumerable()Object.prototype.toLocaleString()Object.prototype.toString()Object.prototype.valueOf()Certaines parties de ce contenu sont protges par le droit d'auteur 19982026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.
| Web Proxy Viewer | New URL | Original Page |