防止传递给 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");
}