没有eval()怎么做

时间:2010-08-08 18:20:49

标签: javascript variables eval

for (var i in variables) {
    eval('var ' + i + ' = variables[i]');
}

基本上,我想将变量属性传递给局部变量。

是否可以使用 eval()

或者哪些更好:

1

var _ = variables;
for (var i = 0; i < 100000; i++) {
    _.test1();
    _.test2();
    _.test3();
}

2

with (variables) {
    for (var i = 0; i < 100000; i++) {
        test1();
        test2();
        test3();
    }
}

第3

var test1 = variables.test1,
    test2 = variables.test2,
    test3 = variables.test3;
for (var i = 0; i < 100000; i++) {
    test1();
    test2();
    test3();
}

4

for (var i in variables) eval('var ' + i + ' = variables[i]');
for (var i = 0; i < 100000; i++) {
    test1();
    test2();
    test3();
}

3 个答案:

答案 0 :(得分:4)

通过查看您的comment似乎您的主要问题是必须多次引用一个深度嵌套的对象,避免使用evalwith我建议您使用别名标识符,例如:

 // some local scope...
 var foo = namespace.constructors.blah.dramatic.variables;
 // replace foo with something meaningful :)
 foo.method1();
 foo.method2();
 foo.property1;
 // etc...

通过这种方式,深度嵌套的对象已经被解析,并且引用您的别名会更快,evalwith IMO只会在这种情况下给您带来更多问题而不是好处。

答案 1 :(得分:0)

一种替代方法是使对象成为当前范围。它不会使属性成为局部变量,但您可以使用this关键字访问它们:

var variables = { a:42, b:1337 };

(function(){
  alert(this.a);
  alert(this.b);
}).apply(variables);

这样做的好处是,您不会在任何地方复制任何内容,而是直接访问属性。

答案 2 :(得分:0)

好吧,我会自己发布答案。

如果不使用eval()...

,则无法在不知道变量名称的情况下设置局部变量

...但是使用局部变量(选项3 )是最好的方法。