我怀疑这样做是否可行,但我想尝试一下。

我想编写一个将新变量引入其调用程序范围的函数。

目标是执行以下操作:

(function() {
    var x = {a: 5, b:6};
    console.log(typeof a, typeof b); // prints: undefined undefined
    magicImport(x);
    console.log(a, b); // prints: 5 6
})();

// Variables are not in global scope
console.log(typeof a, typeof b); // prints: undefined undefined

如果magicImport(x)做类似
eval("var a = x.a; var b = x.b;");

但这并没有真正的帮助,因为ab的范围将限于magicImport内部。

而且当然
eval("a = x.a; b = x.b;");

这是不好的,因为那样会修改全局对象。

有什么办法可以在更高范围内使用eval代码吗?

编辑:如果不清楚,目标是创建可以导入 namespace 内容而不污染全局范围的函数,而不必将那些导入的对象放置到新的容器对象中。

最佳答案

如您所述,您需要评估,但是您必须评估它们需要定义的范围。没有办法推迟调用eval。 magicImport必须构建要评估的字符串:

(function() {
    var x = {a: 5, b:6};
    console.log(typeof a, typeof b);  // output: undefined undefined
    eval(magicImport(x));
    console.log(a, b);                // output: 5 6
})();

// Variables are not in global scope
console.log(typeof a, typeof b);      // output: undefined undefined

function magicImport(x){
    return "var a=" + x.a + ",b=" + x.b ;
}

另一种选择是跳过函数调用并使用循环。除了eval(magicImport(x));,您可以将其替换为:
for(prop in x){eval("var " + prop + "=" + x[prop]);}

要么
 var str = "";
 for(prop in x){str + = "var " + prop + "=" + x[prop] + ";" ;}
 eval(str);

09-11 20:43