Как это сделать без eval () - PullRequest
       13

Как это сделать без eval ()

0 голосов
/ 08 августа 2010
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 ]

4 голосов
/ 08 августа 2010

При просмотре вашего комментария кажется, что вашей главной заботой является необходимость несколько раз ссылаться на глубоко вложенный объект, избегая 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 только вызовет у вас больше проблем, чем преимуществ в этом случае.

0 голосов
/ 09 августа 2010

Хорошо, я отправлю ответ сам.

Нет.

Невозможно установить локальные переменные без знания имени переменной без использованияeval () ...

... Но лучше использовать локальные переменные ( опция 3 ).

0 голосов
/ 08 августа 2010

Один из вариантов - сделать объект текущей областью действия. Это не сделает свойства локальными переменными, но вы можете получить к ним доступ, используя ключевое слово this:

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

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

Это имеет то преимущество, что вы никуда не копируете, вы получаете доступ к свойствам напрямую.

...