我怀疑这是可能的,但我想试一试.
我想编写一个函数,将新变量引入其调用者的范围.
目标是做这样的事情:
(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,但您必须在需要定义的范围内进行评估.没有办法推迟调用eval. magicImport必须构建要评估的字符串:
(function() { var x = {a: 5,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);