2016-12-26 3 views
-2

Я сделал JSFiddle для моей проблемы: (также ниже) https://jsfiddle.net/oymrrL81/Не позволяйте Eval доступ к переменным в функции

var code = ["alert('first');n=1;", "alert('second');", "alert('third');IWantThisVariableChanged = true;", "alert('fourth');"]; 

var IWantThisVariableChanged = false; 

function doStuff(){ 
    for(var n = 0; n != 4;n++){ 
    eval(code[n]); 
    } 
} 

doStuff(); 

alert("Variable changed? " + IWantThisVariableChanged); 

В основном я хотел бы код оцененного внутри функции, чтобы только быть в состоянии получить доступ к переменным вне функции, в которой находится eval. Это связано с тем, что она меняет мою переменную, которую я использую для моего цикла for, и разрушает цикл. И, пожалуйста, не рекомендую ли я изменить имя переменного в моем цикле :(, мне нужно решение любого переменного имени.

+0

эз, никогда, НИКОГДА, не используйте Eval. – user2267175

+1

Почему вы пытаетесь это сделать? Если вы не хотите, чтобы локальный 'n' был изменен, какой' n' ** do ** вы хотите изменить? –

ответ

0

Попробуйте выполнить eval в другом контексте. Как

function inContext(code){ 
    eval(code); 
} 

function doStuff(){ 
    for(var n = 0; n != 4;n++){ 
    inContext.call(null, code[n]); 
    //eval(code[n]); 
    } 
} 

Надеется, что это помогает

+0

переменная @ contextazaburo 'context' была чем-то, что я играл в jsfiddle, удалил эту часть. Разница в том, что в исходном коде, когда 'eval' был вызван в' doStuff', он выполнялся в этой локальной области и вмешивался в переменную 'n'. – shakib

0

Вы можете использовать объект для хранения значений, Object.keys(), RegExp.prototype.test, Strin.prototype.split(), String.prototype.replace(), isNaN, Number, Boolean, new Function конструктор

var code = ["alert('first');n=1;" 
 
      , "alert('second');" 
 
      , "alert('third');IWantThisVariableChanged = true;" 
 
      , "alert('fourth');"]; 
 

 
var obj = { 
 
    IWantThisVariableChanged: false, 
 
    n: null 
 
}; 
 

 
function doStuff(o) { 
 
    let props = Object.keys(o); 
 
    for (let n = 0; n != 4; n++) { 
 
    for (var i = 0, prop = void 0; i < props.length; i++) { 
 
     if (new RegExp(props[i] + "(?=\\s+=|=)").test(code[n])) { 
 
     prop = props[i]; 
 
     break; 
 
     } 
 
    }; 
 
    if (prop) { 
 
     var value = code[n].split(prop).pop().replace(/=|;/g, ""); 
 
     o[prop] = !isNaN(value) ? Number(value) : Boolean(value); 
 
    } 
 
    new Function(code[n])(); 
 
    } 
 
} 
 

 
doStuff(obj); 
 

 
alert("Variable changed? " + obj.IWantThisVariableChanged); 
 
console.log(obj);