07.02.2015, 18:53
|
Интересующийся
|
|
Регистрация: 24.11.2014
Сообщений: 13
|
|
Переменная из строки и область видимости
Наверное я сам себя загнал в такую задачу и можно решить по-другому, и всё же. из БД нужно выдернуть массив, на основании значения из [0] создать переменную и присвоить ей остальной массив.
function somefunc() {
arr = [х, 0, 1, 2...];
varname = arr.shift();
this[varname] = arr;
}
это понятно и работает. проблема в том, что этот разбор производится внутри функции, и переменные снаружи не видно. как объявить переменную перед функцией, ведь вот так не получится:
var this[varname] = 0;
подытожу, вопрос именно в этом: как создать переменную по имени из строки понятно, а вот как её объявить - не очень.
|
|
07.02.2015, 19:16
|
Интересующийся
|
|
Регистрация: 06.02.2015
Сообщений: 29
|
|
Если вы хотите объявить переменную которую можно было бы использовать в любой части программы то нужно объявлять ее вне функции
var global_var;
function funck(){
var global_var = "new"; // (не правильно) если внутри функции поставить var перед переменной с таким же именем то вроде бы если я правильно помню вы объявляете новую локальную переменную при это значение глобальной изменятся не будет
global_var = "new"; // (правильно)
//cod...
}
|
|
07.02.2015, 19:40
|
Интересующийся
|
|
Регистрация: 24.11.2014
Сообщений: 13
|
|
что переменные нужно объявить снаружи функции, это понятно.
но как это сделать, если имя переменной мне заранее неизвестно?
расширю немного свой вопрос:
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
}
|
|
07.02.2015, 19:49
|
Интересующийся
|
|
Регистрация: 06.02.2015
Сообщений: 29
|
|
Я не понимаю, вы не знаете имен переменных или их количество или что то еще? Как они вообще у вас создаются тогда если вы сами их не знаете?
Не понятно...
|
|
07.02.2015, 20:07
|
Интересующийся
|
|
Регистрация: 24.11.2014
Сообщений: 13
|
|
да, я не знаю не имен переменных, ни их количество. если упрощать, идея такая: пользователь сам придумывает имена переменных и значения, (x=1, y=2, z=3) сам пишет формулы (x+y+z). я разбираю формулы, создаю переменные и считаю.
самый простой алгоритм - это создать одноименные переменные (как в формуле), присвоить им значения, и сделать eval() формуле.
о вопросах безопасности в курсе, все переменные буду проверять перед eval().
|
|
07.02.2015, 20:47
|
Интересующийся
|
|
Регистрация: 06.02.2015
Сообщений: 29
|
|
Мммм не знаю, может мне знаний не хватает я только новичек но честно говоря не уверен что так можно делать как вы предлагаете
Как вариант можно создать массив в который будут добавляться новые значения каждый раз при вызове функции и потому уже обращаться к этому значению по его индексу в массиве, может можно сделать как то похитрее что нибудь вроде двумерного массива или какого нибудь объекта в объекте хз...
Тут вам нужен кто то более подкованный чем я...
Вот мой пример
<!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>
Последний раз редактировалось arcmag, 07.02.2015 в 21:28.
|
|
07.02.2015, 22:14
|
Интересующийся
|
|
Регистрация: 24.11.2014
Сообщений: 13
|
|
всё это хорошо, но не решает основной задачи: расчёта по введённой пользователем формуле.
введите параметр №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. я тоже начинающий программист ))
|
|
07.02.2015, 22:35
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Сообщение от scruwi
|
arr = ();
|
var arr = {};
|
|
07.02.2015, 22:40
|
Интересующийся
|
|
Регистрация: 06.02.2015
Сообщений: 29
|
|
Сообщение от scruwi
|
всё это хорошо, но не решает основной задачи: расчёта по введённой пользователем формуле.
введите параметр №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. я тоже начинающий программист ))
|
Ну так а чем вас мой код то не устраивает? (добавил комментарии чтоб вам понятнее было)
<!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>
Я написал код в котором вы вводите в первое поле ИМЯ переменной а во второе поле ее ЗНАЧЕНИЕ после чего вы можете по имени своей переменной вытащить то значение которое как бы в нее сохраняли и с этими значениями делать все что хотите. Таким образом вы сами определяете имя переменной, ее значение и имеете возможность создать любое количество этих "переменных".
Если у вас есть какая то формула подставляйте их в нее и тд.
|
|
07.02.2015, 22:46
|
Интересующийся
|
|
Регистрация: 24.11.2014
Сообщений: 13
|
|
Сообщение от рони
|
var arr = {};
|
как это решит то, что я не увижу созданную "из строки" переменную снаружи функции? повторю еще раз проблему:
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
}
Последний раз редактировалось scruwi, 07.02.2015 в 22:51.
|
|
|
|