Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在没有eval()的情况下执行此操作_Javascript_Variables_Eval - Fatal编程技术网

Javascript 如何在没有eval()的情况下执行此操作

Javascript 如何在没有eval()的情况下执行此操作,javascript,variables,eval,Javascript,Variables,Eval,基本上,我想将变量属性转移到局部变量 除了使用eval() 或者哪一个更好: 1. for (var i in variables) { eval('var ' + i + ' = variables[i]'); } var _ = variables; for (var i = 0; i < 100000; i++) { _.test1(); _.test2(); _.test3(); } with (variables) { for (var

基本上,我想将变量属性转移到局部变量

除了使用eval()

或者哪一个更好:

1.

for (var i in variables) {
    eval('var ' + i + ' = variables[i]');
}
var _ = variables;
for (var i = 0; i < 100000; i++) {
    _.test1();
    _.test2();
    _.test3();
}
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();
}
var=变量;
对于(变量i=0;i<100000;i++){
_.test1();
_.test2();
_.test3();
}
2.

for (var i in variables) {
    eval('var ' + i + ' = variables[i]');
}
var _ = variables;
for (var i = 0; i < 100000; i++) {
    _.test1();
    _.test2();
    _.test3();
}
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();
}
with(变量){
对于(变量i=0;i<100000;i++){
test1();
test2();
test3();
}
}
3.

for (var i in variables) {
    eval('var ' + i + ' = variables[i]');
}
var _ = variables;
for (var i = 0; i < 100000; i++) {
    _.test1();
    _.test2();
    _.test3();
}
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();
}
var test1=variables.test1,
test2=variables.test2,
test3=variables.test3;
对于(变量i=0;i<100000;i++){
test1();
test2();
test3();
}
4.

for (var i in variables) {
    eval('var ' + i + ' = variables[i]');
}
var _ = variables;
for (var i = 0; i < 100000; i++) {
    _.test1();
    _.test2();
    _.test3();
}
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();
}
for(变量中的变量i)eval('var'+i+'=变量[i]');
对于(变量i=0;i<100000;i++){
test1();
test2();
test3();
}
通过查看您的,您的主要问题似乎是必须多次引用深度嵌套的对象,避免
eval
使用
我只建议您使用别名标识符,例如:

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

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

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

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

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

好吧,我会自己发布答案

否。

for (var i in variables) {
    eval('var ' + i + ' = variables[i]');
}
var _ = variables;
for (var i = 0; i < 100000; i++) {
    _.test1();
    _.test2();
    _.test3();
}
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();
}
如果不使用eval(),则无法在不知道变量名称的情况下设置局部变量


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

你到底为什么要这样做?如果“变量”很长,比如:namespace.constructors.blah.戏剧性的.variables,并且变量的内容被引用了很多,那么将其内容包含在局部变量中是很有用的。可以使用“with”关键字,但这有其自身的问题。这个例子简单易懂。你应该避免使用
eval()
util。你对JS非常了解,知道什么时候绝对有必要使用它,因为它速度慢,而且使用起来通常被认为是不好的做法。@indie你读过问题标题了吗?谢谢。我当然考虑过了。但是,考虑到变量名称是已知的;我不使用别名,而是重复eval所做的工作。比如,var a=变量a;var b=变量b;等等我相信这是最有效的方法,但没有我想要的那么优雅。eval保存了一些字节,但看起来像一个黑客。用eval设置十几个变量在性能方面应该不会太明显。@Carlos Gil保存“字节”是一项毫无价值的工作。如果你想通过减少范围链查找来优化你的代码,那么@CMS有一条路要走。而且,
eval
(有时是
with
)的速度很慢,而且
with
使用不当的副作用使得它不值得使用。@Justin Johnson我很确定,在最初设置局部变量后,访问它们的速度比其中一个的属性快。意思访问foo*比访问foo.property*更快。如果我大错特错,请解释。过早的优化是。。某物使用“sav[ing]some bytes”作为理由是在这种心态下思考。@strager“save some bytes”不是理由,而是陈述。这怎么可能比只分配
变量
一个较短的名称更好呢。您仍然可以直接访问属性。@MooGoo:不,如果您将属性复制到局部变量,您将无法直接访问属性。如果更改局部变量,则属性不会更改。我说的是“分配
变量
一个较短的名称”,即
var v=variables
v
保存对
变量所引用的同一对象的引用,这与
这个
保存该引用没有什么不同,只是它更简洁,不需要不必要的函数调用(如果不比使用
with
慢的话,它可能也同样慢)。@MooGoo:好的,我明白你的意思了。不,这不是更好,我从来没有说过,这只是另一种方式。