我怀疑这样做是否可行,但我想尝试一下。
我想编写一个将新变量引入其调用程序范围的函数。
目标是执行以下操作:
(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;");
但这并没有真正的帮助,因为
a
和b
的范围将限于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);