Maison >interface Web >js tutoriel >Série JavaScript Advanced : pourquoi ne pas utiliser eval

Série JavaScript Advanced : pourquoi ne pas utiliser eval

黄舟
黄舟original
2017-02-08 09:40:361351parcourir
  • Évaluation déguisée

  • Problèmes de sécurité

  • Conclusion

eval exécute une chaîne de code JavaScript dans la portée actuelle.

var foo = 1;
function test() {
    var foo = 2;
    eval('foo = 3');
    return foo;
}
test(); // 3
foo; // 1
Mais 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; // 3
Note 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; // 3
Dans 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ée

Les 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.

Conclusion

N'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) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn