Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переменная из строки и область видимости (https://javascript.ru/forum/misc/53529-peremennaya-iz-stroki-i-oblast-vidimosti.html)

danik.js 08.02.2015 06:52

var array = ['x', 'y', 'z'],
    expression = "x+y+z";
 
var scope = new Scope(array);
 
var result = eval('with(scope){' + expression + '}');
alert(result);

function Scope(array){
   this[array[0]] = 1;   // x=1
   this[array[1]] = 2;   // y=2
   this[array[2]] = 3;   // z=3
}

freee 08.02.2015 11:32

Цитата:

Сообщение от scruwi
введите параметр №1: x=1
введите параметр №2: y=2
...
введите формулу: x+y

Че то ты намудрил, п-ц.
<html>
<head>
</head>
<body>
<script>
calc=function(){
 eval("var "+prompt("input variable"));
 eval("var "+prompt("input variable"));
 alert(eval(prompt("input expression")));
}
calc()

</script>

</body>
</html>

scruwi 08.02.2015 14:37

Цитата:

Сообщение от danik.js (Сообщение 355592)
var array = ['x', 'y', 'z'],
    expression = "x+y+z";
 
var scope = new Scope(array);
 
var result = eval('with(scope){' + expression + '}');
alert(result);

function Scope(array){
   this[array[0]] = 1;   // x=1
   this[array[1]] = 2;   // y=2
   this[array[2]] = 3;   // z=3
}

спасибо. мне тут еще кое-что незнакомо, но разберусь.
я пока проблему свою решил по-другому. не знаю, насколько элегантно, но думаю с регекспами это конечно очень медленно:

var array = somefunc(),
    expression = 'x+y+z',
    result = '';

expression = expression.replace(/([a-z])+/g, "array['$1']"); // array['x']+array['y']+array['z']
result = eval(expression);
alert(result);

function somefunc() {
    array = { // параметры разобрал на ассоциативный массив
        'x': 1,
        'y': 2,
        'z': 3 };
    return array;
}


Часовой пояс GMT +3, время: 14:04.