Maison >interface Web >js tutoriel >Série JavaScript Advanced : pourquoi ne pas utiliser eval
Évaluation déguisée
Problèmes de sécurité
Conclusion
var foo = 1; function test() { var foo = 2; eval('foo = 3'); return foo; } test(); // 3 foo; // 1Mais eval n'est exécuté dans la portée actuelle que s'il est appelé directement et que la fonction appelante est eval elle-même.
var foo = 1; function test() { var foo = 2; var bar = eval; bar('foo = 3'); return foo; } test(); // 2 foo; // 3Note du traducteur : le code ci-dessus équivaut à appeler eval dans la portée globale, et a le même effet que les deux façons d'écrire suivantes :
// 写法一:直接调用全局作用域下的 foo 变量 var foo = 1; function test() { var foo = 2; window.foo = 3; return foo; } test(); // 2 foo; // 3 // 写法二:使用 call 函数修改 eval 执行的上下文为全局作用域 var foo = 1; function test() { var foo = 2; eval.call(window, 'foo = 3'); return foo; } test(); // 2 foo; // 3Dans tous les cas nous L'utilisation de la fonction eval doit être évitée. 99,9 % des scénarios qui utilisent eval ont des solutions qui n'utilisent pas eval. Évaluation déguiséeLes fonctions planifiées setTimeout et setInterval peuvent accepter des chaînes comme premier paramètre. Cette chaîne est toujours exécutée dans la portée globale, donc eval n'est pas appelé directement dans ce cas. Problèmes de sécuritéeval présente également des problèmes de sécurité car il exécutera tout code qui lui est transmis. N'utilisez jamais eval lorsque la chaîne de code est inconnue ou provient d'une fonction non fiable. ConclusionN'utilisez jamais eval, tout code qui l'utilise sera discutable en termes de fonctionnement, de performances et de sécurité. Si une situation nécessite l'utilisation d'eval pour fonctionner correctement, sa conception sera tout d'abord remise en question, cela ne devrait pas être la solution privilégiée, et une meilleure solution qui n'utilise pas eval devrait être pleinement envisagée et priorisée. Ce qui précède est la série JavaScript avancée - pourquoi ne pas utiliser eval Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !