2010-08-08 131 views
-1
for (var i in variables) { 
    eval('var ' + i + ' = variables[i]'); 
} 

基本上,我想将变量属性转移到局部变量。如何在没有eval的情况下执行此操作()

是否有使用的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(); 
    } 
} 

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(); 
} 
+8

为什么在这个世界上你想要这样做? – 2010-08-08 18:22:38

+0

如果'变量'真的很长,如:namespace.constructors.blah.dramatic.variables 并且变量的内容被引用很多,那么将它的内容放在局部变量中很有用。 可以使用'with'关键字,但有它自己的问题。 该示例很简单。 – 2010-08-08 18:29:41

+0

你应该避免使用'eval()'util,你知道JS很好,知道什么时候它是绝对必要的,因为它的速度慢,而且它的使用通常被认为是不好的做法。 – xj9 2010-08-08 20:01:21

回答

0

那么,我会自己发布答案。

有没有办法来设置局部变量不知道该变量的名称,而不使用eval()...

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

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将比在这种情况下,只有好处,因为你的问题更多。

+0

谢谢。当然,我认为这一点。但是,由于变量名称是已知的,而不是使用别名,我只是重复eval的做法。像,var a = variables.a; var b = variables.b;等等......我认为这是最有效的方法,但并不像我想的那样优雅。 eval保存了一些字节,但看起来像一个黑客。用eval设置十几个变量不应该是明显的性能明智的。 – 2010-08-08 18:52:14

+3

@Carlos Gil保存“字节”是一个毫无价值的努力。如果您想通过减少范围链查找来优化您的代码,那么@CMS拥有的方法就是要走。另外,'eval'(有时'with')速度很慢,不适当使用''with'的副作用使其不值得使用。 – 2010-08-08 19:03:42

+0

@Justin Johnson我很确定,在初始设置局部变量后,它们的访问速度比其中一个属性快。含义; foo *的访问速度比foo.property *快。如果我错了,请解释一下。 – 2010-08-08 19:17:42

0

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

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

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

这样做,你是不是抄袭任何东西任何地方,你是直接访问性能优势。

+1

这怎么可能比仅仅给变量分配一个更短的名字更好。您仍然可以直接访问属性。 – MooGoo 2010-08-08 20:04:41

+0

@MooGoo:不,如果将属性复制到本地变量,则不会直接访问属性。如果您更改本地变量,则该属性不会更改。 – Guffa 2010-08-08 20:24:05

+0

我说过“分配变量'一个较短的名字”,即'var v = variables'。 'v'对同一个对象有一个引用,即'变量'引用与'this'持有该引用没有区别,除了它更简洁并且不需要不必要的函数调用(如果不慢使用'with')。 – MooGoo 2010-08-08 20:37:36

相关问题