防止传递给 Eval 的对象字符串化
Prevent Stringifcation of Objects Passed Into Eval
考虑这段代码:
function set(n,v) { // This is a setter
eval(n+"="+v);
}
let one = 1;
function add1(num) {
return num + one;
}
{
let two = 2;
set("add1", function(num) {
return num + two;
});
}
// Add 1 now equals:
// function(num) {
// return num + two;
// }
// So if we call add 1:
add1();
// We get a "Uncaught ReferenceError: two is not defined"
这是因为 eval
将函数字符串化,从而删除了它与它所依赖的变量的联系
我如何阻止它(保持 set
行为,但防止函数留下变量)
不要使用 eval
作为可变变量。请改用对象,如 here
所述
现在,回答你的问题:因为 direct eval
可以访问你的局部变量,你所要做的就是在 eval
字符串,而不是从外部传递:
function set(n, v) {
eval(n + "= v");
}
考虑这段代码:
function set(n,v) { // This is a setter
eval(n+"="+v);
}
let one = 1;
function add1(num) {
return num + one;
}
{
let two = 2;
set("add1", function(num) {
return num + two;
});
}
// Add 1 now equals:
// function(num) {
// return num + two;
// }
// So if we call add 1:
add1();
// We get a "Uncaught ReferenceError: two is not defined"
这是因为 eval
将函数字符串化,从而删除了它与它所依赖的变量的联系
我如何阻止它(保持 set
行为,但防止函数留下变量)
不要使用 eval
作为可变变量。请改用对象,如 here
现在,回答你的问题:因为 direct eval
可以访问你的局部变量,你所要做的就是在 eval
字符串,而不是从外部传递:
function set(n, v) {
eval(n + "= v");
}