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();
}
答案 0 :(得分:4)
通过查看您的comment似乎您的主要问题是必须多次引用一个深度嵌套的对象,避免使用eval
和with
我建议您使用别名标识符,例如:
// some local scope...
var foo = namespace.constructors.blah.dramatic.variables;
// replace foo with something meaningful :)
foo.method1();
foo.method2();
foo.property1;
// etc...
通过这种方式,深度嵌套的对象已经被解析,并且引用您的别名会更快,eval
和with
IMO只会在这种情况下给您带来更多问题而不是好处。
答案 1 :(得分:0)
一种替代方法是使对象成为当前范围。它不会使属性成为局部变量,但您可以使用this
关键字访问它们:
var variables = { a:42, b:1337 };
(function(){
alert(this.a);
alert(this.b);
}).apply(variables);
这样做的好处是,您不会在任何地方复制任何内容,而是直接访问属性。
答案 2 :(得分:0)
好吧,我会自己发布答案。
否强>
如果不使用eval()...
,则无法在不知道变量名称的情况下设置局部变量...但是使用局部变量(选项3 )是最好的方法。