É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
Copier après la connexion
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
Copier après la connexion
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
Copier après la connexion
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) !