La fonction eval est un moyen puissant et facile à générer dynamiquement du code, alors, quelles sont les mises en garde ?
Réponses
Trop de publicités?Une mauvaise utilisation de eval ouvre votre code pour les attaques par injection
Le débogage peut être plus difficile (pas de numéro de ligne, etc.)
eval avais le code s'exécute plus lentement (pas de possibilité de compiler/cache eval avais le code)
Edit: @Jeff Walden points dans les commentaires, n ° 3 est moins vrai aujourd'hui qu'il ne l'était en 2008. Cependant, alors que certains la mise en cache des scripts compilés peut arriver, ce ne sera limitée que pour les scripts qui sont eval avait répété sans modification. Un scénario plus probable est que vous êtes eval avec des scripts qui ont subi une légère modification à chaque fois et en tant que telle n'a pas pu être mis en cache. Disons simplement que CERTAINS eval avais le code s'exécute plus lentement.
eval n'est pas toujours le mal. Il y a des moments où il est parfaitement approprié.
Cependant, eval est actuellement et historiquement massivement sur-utilisé par des gens qui ne savent pas ce qu'ils font. Qui comprend les gens écrire des tutoriels JavaScript, malheureusement, et dans certains cas, cela peut en effet avoir des conséquences sur la sécurité - ou, plus souvent, de simples bugs. Si l'on peut faire de plus pour lancer une interrogation sur la fonction eval, mieux c'est. Tout moment vous utilisez la fonction eval vous avez besoin pour la santé mentale-vérifier ce que vous faites, parce que les chances sont que vous pourriez faire un meilleur, plus sûr, plus propre.
Pour donner un trop typique exemple, pour définir la couleur d'un élément avec un id stocké dans la variable 'pommes de terre':
eval('document.' + potato + '.style.color = "red"');
Si les auteurs de la sorte de code ci-dessus a eu une idée sur les principes de base de la façon dont des objets en JavaScript, ils ont réalisé que les crochets peuvent être utilisés à la place de littéral dot-noms, éliminant ainsi la nécessité pour les eval:
document[potato].style.color = 'red';
...ce qui est beaucoup plus facile à lire ainsi que potentiellement moins buggé.
(Mais alors, quelqu'un qui /vraiment/ savaient ce qu'ils faisaient dirais:
document.getElementById(potato).style.color = 'red';
ce qui est plus fiable que l'douteux vieux truc de l'accès à des éléments du DOM tout droit sorti de l'objet document.)
Deux points viennent à l’esprit :
- Sécurité (mais tant que vous générez la chaîne à évaluer vous-même, c’est peut-être pas un problème)
- Rendement : jusqu'à ce qu’on ne connaît pas le code à exécuter, il ne peut pas être optimisé. (à propos de javascript et performances, certainement la Présentation de Steve Yegge)