Qu'est-ce que eval fait et pourquoi son mal?

var myString = "x", myObject = { x: 10 }, value = eval("myObject." + myString); alert(value) alert(myObject[myString]); 

Http://jslinterrors.com/eval-is-evil/

J'ai lu sur eval () sur Internet, mais je ne pouvais pas vraiment saisir ce qu'il fait en dehors de " It Evaluates a expression ".

Devons-nous utiliser la fonction eval () uniquement pour les valeurs numériques ?.

eval() prend la chaîne elle est donnée, et l'exécute comme s'il s'agissait d'un code JavaScript simple.

Il est considéré comme «méchant» car:

  • Cela complique trop les choses – la plupart des cas où eval() est utilisé, il y aurait une solution beaucoup plus simple qui ne l'exigeait pas. Cet exemple dans la question est un cas parfait: il n'est absolument pas nécessaire d' eval() pour une expression comme celle-ci. JS a une syntaxe parfaitement bonne pour référencer un nom de propriété d'objet en tant que chaîne ( myObject["x"] est identique à myObject.x ).

  • Il est beaucoup plus difficile à déboguer – Il est plus difficile de travailler avec un débogueur, et même une fois que vous avez réussi à déterminer ce qui se passe, vous avez du travail supplémentaire parce que vous devez déboguer à la fois le code eval'd et le Code qui a généré la chaîne d'origine à eval.

  • Cela ralentit les choses: le compilateur de script ne peut pas pré-compiler le code dans un eval() , car il ne sait pas ce que le code contiendra jusqu'à ce qu'il y arrive. Donc, vous perdez sur certains avantages de performance dans les moteurs modernes de Javascript.

  • C'est le rêve d'un pirate – eval() exécute une chaîne comme code. Les hackers adorent cela parce qu'il est beaucoup plus facile d'injecter une chaîne dans un programme que d'injecter du code; Mais eval() signifie que vous pouvez injecter une chaîne et l'exécuter comme code. Ainsi, eval() rend votre code plus facile à pirater. (Ceci est moins important pour le Javascript basé sur le navigateur que pour d'autres langues, car le code JS est accessible dans le navigateur de toute façon, de sorte que votre modèle de sécurité ne doit pas être basé sur le fait que votre code est immuable, mais néanmoins les hacks d'injection peuvent encore être un problème , En particulier avec les attaques entre sites).

Dans ce cas, utilisez simplement myObject[myString] .

eval est horriblement mal utilisé. À peu près, la seule utilisation valable que j'ai trouvée consiste à analyser JSON dans les anciens navigateurs.