2015-07-04 5 views
0

У меня есть некоторый возврат кода с сервера типа «var myVar = 314;», я хотел бы создать объект контекста, такой как var context = {}; а затем eval скрипт «var myVar = 314;» в свойствах контекста, как я мог это достичь?Как преобразовать переменные в свойства локального объекта области видимости вместо глобальной области в JavaScript

Я попытался код ниже, но без успеха:

var context = {}; 
eval.call(context, "var myVar = 314;"); 

EDIT Может быть, я не был достаточно ясно, в первую очередь, результат я ожидал, это: после того, как Eval(), Я получил свойства в объекте контекста, цель состоит в том, чтобы избежать глобального охвата населения.

Например,

var context = {}; 
eval.call(context, "var myVar = 314;"); 

я ожидал бы результат как context.myVar = 314.

+1

Попробуйте 'context [" myVar "] = 314;'? –

+1

Переменные не входят в объекты. Не уверен, что вы на самом деле спрашиваете. Что вы хотите в итоге? –

+0

Возможный дубликат [вызов eval() в определенном контексте] (http://stackoverflow.com/questions/8403108/calling-eval-in-particular-context) –

ответ

0

Вы можете изменить формат сценария вы получите с сервера? Если да, то следуйте советам в комментарии Aadit и иметь свой сервер отправить:

context["myVar"] = 314; 

или:

context.myVar = 314; 

Если вы не можете изменить формат, является сценарий буквально так просто, как var myVar = 314;?

Если да, попробуйте переосмыслить подход. Вместо того, чтобы пытаться использовать сценарий в определенном контексте, проанализируйте скрипт в форме, с которой вы можете работать. Например:

var script = 'var myVar = -314.5;'; // what we get from the server 
var match = script.match(/var\s+(\w+)\s*=\s*(-?[\d.]+)\s*;/); 
if(match) { 
    // match[1] is 'myVar', match[2] is '-314.5' 
    context[ match[1] ] = +match[2]; 
} 
console.log(context); 

Теперь context является { myVar: -314.5 }. Этот код может быть запущен внутри функции или где угодно и будет работать одинаково.

Вы можете использовать аналогичное регулярное выражение для строки переменного назначения:

var script = 'var myString = "Test Value";'; // what we get from the server 
var match = script.match(/var\s+(\w+)\s*=\s*"([^"]*)"\s*;/); 
if(match) { 
    // match[1] is 'myString', match[2] is 'Test Value' 
    context[ match[1] ] = match[2]; 
} 
console.log(context); 

На этот раз context является { myString: "Test Value" }

Этого подход может быть легко адаптирован для нескольких переменных, других типов данных и т.д.

+0

Спасибо, ваш подход работает как шарм. Я думал, что мне удалось ограничить объем eval(), чтобы объявление, подобное var someVal, попадало в эту область, подобную области глобальной видимости. – Ryan

Смежные вопросы