Переменная из строки и область видимости
Наверное я сам себя загнал в такую задачу и можно решить по-другому, и всё же. из БД нужно выдернуть массив, на основании значения из [0] создать переменную и присвоить ей остальной массив.
function somefunc() {
arr = [х, 0, 1, 2...];
varname = arr.shift();
this[varname] = arr;
}
это понятно и работает. проблема в том, что этот разбор производится внутри функции, и переменные снаружи не видно. как объявить переменную перед функцией, ведь вот так не получится: var this[varname] = 0; подытожу, вопрос именно в этом: как создать переменную по имени из строки понятно, а вот как её объявить - не очень. |
Если вы хотите объявить переменную которую можно было бы использовать в любой части программы то нужно объявлять ее вне функции
var global_var;
function funck(){
var global_var = "new"; // (не правильно) если внутри функции поставить var перед переменной с таким же именем то вроде бы если я правильно помню вы объявляете новую локальную переменную при это значение глобальной изменятся не будет
global_var = "new"; // (правильно)
//cod...
}
|
что переменные нужно объявить снаружи функции, это понятно.
но как это сделать, если имя переменной мне заранее неизвестно? расширю немного свой вопрос:
var variables = ['x', 'y', 'z']; // три переменных, которые нужно создать
...
for (i=0;i<variables.length;++i){
var this[variables[i]]; // хотелось бы объявить вот так, но так нельзя. а как?
}
...
somefunc(variables);
console.log(x,y,z); // undefined
function somefunc(v) {
for (i=0;i<v.length;++i){
this[v[i]] = 1; // объявляется внутри ф-ии
}
console.log(x,y,z); // x=1, y=1, z=1
}
|
Я не понимаю, вы не знаете имен переменных или их количество или что то еще? Как они вообще у вас создаются тогда если вы сами их не знаете?
Не понятно... |
да, я не знаю не имен переменных, ни их количество. если упрощать, идея такая: пользователь сам придумывает имена переменных и значения, (x=1, y=2, z=3) сам пишет формулы (x+y+z). я разбираю формулы, создаю переменные и считаю.
самый простой алгоритм - это создать одноименные переменные (как в формуле), присвоить им значения, и сделать eval() формуле. о вопросах безопасности в курсе, все переменные буду проверять перед eval(). |
Мммм не знаю, может мне знаний не хватает я только новичек но честно говоря не уверен что так можно делать как вы предлагаете :(
Как вариант можно создать массив в который будут добавляться новые значения каждый раз при вызове функции и потому уже обращаться к этому значению по его индексу в массиве, может можно сделать как то похитрее что нибудь вроде двумерного массива или какого нибудь объекта в объекте хз... Тут вам нужен кто то более подкованный чем я... Вот мой пример
<!doctype html>
<html>
<head>
<title>Мммм...</title>
<script>
var mass_name = new Array();
var mass_value = new Array();
var now_var;
function new_var(){
var valueV = document.getElementById("value_var").value;
var valueN = document.getElementById("value_name").value;
mass_name.push(valueN);
mass_value.push(valueV);
}
function out_var(){
var valueN = document.getElementById("name_val").value;
var v = 0;
for(a in mass_name){ mass_name[v]==valueN?now_var = v : v++; }
if(mass_name.length<=v) document.getElementById("info").innerHTML = "Не верное имя переменной";
else document.getElementById("info").innerHTML = mass_name[v]+" "+mass_value[v];
}
</script>
<body>
<input type="text" id="value_name">
<input type="text" id="value_var">
<input type="button" value="Создать переменную" onClick="new_var()"><br>
Если вы хотите получить значение переменной укажите ее имя:<br>
<input type="text" id="name_val">
<input type="button" value="Вывести" onClick="out_var()">
<output id="info"></output>
</body>
</html>
|
всё это хорошо, но не решает основной задачи: расчёта по введённой пользователем формуле.
введите параметр №1: x=1 введите параметр №2: y=2 ... введите формулу: x+y ------------------------------ решение: 3 причем формула оперирует не параметрами (например П.№1 + П.№2) а именно именами переменных, которые придумал пользователь. сейчас попробую решить через: 1. объявляю ассоциативный массив var arr = (); 2. внутри ф-ии собираю в него переменные в виде ключ => значение 3. разбираю формулу чтобы получилось так: было: x+y+z стало: arr[x]+arr[y]+arr[z] 4. делаю этой новой формуле eval(); ps. я тоже начинающий программист :))) |
Цитата:
var arr = {};
|
Цитата:
<!doctype html>
<html>
<head>
<title>Мммм...</title>
<script>
var mass_name = new Array();
var mass_value = new Array();
var now_var;
function new_var(){
var valueV = document.getElementById("value_var").value; // создаем имя переменной
var valueN = document.getElementById("value_name").value; // создаем ее значение
// первый массив у нас отвечает за имя новой переменной а второй за ее значение
// их можно создавать сколько угодно
mass_name.push(valueN);
mass_value.push(valueV);
}
function out_var(){
var valueN = document.getElementById("name_val").value;
var v = 0;
for(a in mass_name){ mass_name[v]==valueN?now_var = v : v++; }
if(mass_name.length<=v) document.getElementById("info").innerHTML = "Не верное имя переменной";
else document.getElementById("info").innerHTML = mass_name[v]+" = "+mass_value[v];
}
</script>
<body>
Имя переменной <input type="text" id="value_name"><!--Указываем имя переменной-->
Значение переменной <input type="text" id="value_var"><!--Значение переменной-->
<input type="button" value="Создать переменную" onClick="new_var()"><br>
<!--Создаем переменную с указанным именем и значением после чего можете записать в массив еще несколько переменных с другими значениями и тд-->
Если вы хотите получить значение переменной укажите ее имя:<br>
<input type="text" id="name_val"> <!--тут вы получаете значение переменной которую создали по ее имени, и можете делать с ним что угодно, либо вытащить другое значение другой переменной-->
<input type="button" value="Вывести" onClick="out_var()">
<output id="info"></output>
</body>
</html>
Я написал код в котором вы вводите в первое поле ИМЯ переменной а во второе поле ее ЗНАЧЕНИЕ после чего вы можете по имени своей переменной вытащить то значение которое как бы в нее сохраняли и с этими значениями делать все что хотите. Таким образом вы сами определяете имя переменной, ее значение и имеете возможность создать любое количество этих "переменных". Если у вас есть какая то формула подставляйте их в нее и тд. |
Цитата:
var array = ['x', 'y', 'z'],
expression = "x+y+z";
somefunc();
eval(expression); // undefined+undefined+undefined
function somefunc(){
this[array[0]] = 1; // x=1
this[array[1]] = 2; // y=2
this[array[2]] = 3; // z=3
}
|
| Часовой пояс GMT +3, время: 13:57. |