Problème:
J’essaye de pusher une fonction dans un tableau array. Cette fonction est constituée notamment d’une partie dynamique (son argument itemValue
) qui doit être interprété avant que la fonction ne soit poussée dans le tableau. J’utilise les templates literals pour ça.
1 |
filterCurrentSelection.push(`({ ${itemValue} }) => ${itemValue} === 1`); |
Les templates literals ont bien été interprétés dans la fonction présente dans le tableau, mais cette dernière est stockée sous forme de string (chaîne de caractères – cf. les guillemets autour de la fonction dans ma capture) et ne peut donc pas être ré-exécutée!
Solution: utiliser Function à la place d’eval()
Source: N’utiliser eval() qu’en dernier recours !
Avec eval() et des template literals
1 |
filterCurrentSelection.push(eval(`({ ${itemValue} }) => ${itemValue} === 1`)); |
Avec Function et sans template literals
1 |
Function('"use strict";return ({ ' + itemValue + '}) => ' + itemValue + ' === 1')(); |
Inclus dans mon push push():
1 |
filterCurrentSelection.push(Function('"use strict";return ({ ' + itemValue + '}) => ' + itemValue + ' === 1')()); |
Solution alternative
Source: How to Call a JavaScript Function From a String Without Using eval
Les deux exemples ci-dessous fonctionnent on their own, mais je n’ai pas réussi à adapter mon propre code pour les faire exploiter.
Fonction sans paramètre
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// WITHOUT PARAMETERS: function runMe(){ console.log("runMe!"); } // function we want to run var fnstring = "runMe"; // find object var fn = window[fnstring]; // is object a function? if (typeof fn === "function") fn(); // results in: // "runMe!" |
Fonction avec trois paramètres
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// WITH PARAMETERS: function runMeParams(one, two, three){ console.log("runMe!" + one); console.log("runMe!" + two); console.log("runMe!" + three); } // function name and parameters to pass var fnstring = "runMeParams"; var fnparams = [1, 2, 3]; // find object var fn = window[fnstring]; // is object a function? if (typeof fn === "function") fn.apply(null, fnparams); // results in: // "runMe!1" // "runMe!2" // "runMe!3" |