Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.02.2015, 18:53
Интересующийся
Отправить личное сообщение для scruwi Посмотреть профиль Найти все сообщения от scruwi
 
Регистрация: 24.11.2014
Сообщений: 13

Переменная из строки и область видимости
Наверное я сам себя загнал в такую задачу и можно решить по-другому, и всё же. из БД нужно выдернуть массив, на основании значения из [0] создать переменную и присвоить ей остальной массив.

function somefunc() {
   arr = [х, 0, 1, 2...];
   varname = arr.shift();
   this[varname] = arr;
}


это понятно и работает. проблема в том, что этот разбор производится внутри функции, и переменные снаружи не видно. как объявить переменную перед функцией, ведь вот так не получится:
var this[varname] = 0;

подытожу, вопрос именно в этом: как создать переменную по имени из строки понятно, а вот как её объявить - не очень.
Ответить с цитированием
  #2 (permalink)  
Старый 07.02.2015, 19:16
Интересующийся
Отправить личное сообщение для arcmag Посмотреть профиль Найти все сообщения от arcmag
 
Регистрация: 06.02.2015
Сообщений: 29

Если вы хотите объявить переменную которую можно было бы использовать в любой части программы то нужно объявлять ее вне функции

var global_var;
function funck(){
var global_var = "new"; // (не правильно) если внутри функции поставить var перед переменной с таким же именем то вроде бы если я правильно помню вы объявляете новую локальную переменную при это значение глобальной изменятся не будет
global_var = "new"; // (правильно) 
//cod...
}
Ответить с цитированием
  #3 (permalink)  
Старый 07.02.2015, 19:40
Интересующийся
Отправить личное сообщение для scruwi Посмотреть профиль Найти все сообщения от scruwi
 
Регистрация: 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
}
Ответить с цитированием
  #4 (permalink)  
Старый 07.02.2015, 19:49
Интересующийся
Отправить личное сообщение для arcmag Посмотреть профиль Найти все сообщения от arcmag
 
Регистрация: 06.02.2015
Сообщений: 29

Я не понимаю, вы не знаете имен переменных или их количество или что то еще? Как они вообще у вас создаются тогда если вы сами их не знаете?
Не понятно...
Ответить с цитированием
  #5 (permalink)  
Старый 07.02.2015, 20:07
Интересующийся
Отправить личное сообщение для scruwi Посмотреть профиль Найти все сообщения от scruwi
 
Регистрация: 24.11.2014
Сообщений: 13

да, я не знаю не имен переменных, ни их количество. если упрощать, идея такая: пользователь сам придумывает имена переменных и значения, (x=1, y=2, z=3) сам пишет формулы (x+y+z). я разбираю формулы, создаю переменные и считаю.
самый простой алгоритм - это создать одноименные переменные (как в формуле), присвоить им значения, и сделать eval() формуле.
о вопросах безопасности в курсе, все переменные буду проверять перед eval().
Ответить с цитированием
  #6 (permalink)  
Старый 07.02.2015, 20:47
Интересующийся
Отправить личное сообщение для arcmag Посмотреть профиль Найти все сообщения от arcmag
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 07.02.2015, 22:14
Интересующийся
Отправить личное сообщение для scruwi Посмотреть профиль Найти все сообщения от scruwi
 
Регистрация: 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. я тоже начинающий программист ))
Ответить с цитированием
  #8 (permalink)  
Старый 07.02.2015, 22:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от scruwi
arr = ();
var arr = {};
Ответить с цитированием
  #9 (permalink)  
Старый 07.02.2015, 22:40
Интересующийся
Отправить личное сообщение для arcmag Посмотреть профиль Найти все сообщения от arcmag
 
Регистрация: 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>

Я написал код в котором вы вводите в первое поле ИМЯ переменной а во второе поле ее ЗНАЧЕНИЕ после чего вы можете по имени своей переменной вытащить то значение которое как бы в нее сохраняли и с этими значениями делать все что хотите. Таким образом вы сами определяете имя переменной, ее значение и имеете возможность создать любое количество этих "переменных".
Если у вас есть какая то формула подставляйте их в нее и тд.
Ответить с цитированием
  #10 (permalink)  
Старый 07.02.2015, 22:46
Интересующийся
Отправить личное сообщение для scruwi Посмотреть профиль Найти все сообщения от scruwi
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пож с JSON, передача id ссылки. wisma jQuery 22 10.02.2014 15:36
Область видимости переменной jquery Prazdnic Общие вопросы Javascript 7 04.01.2013 19:17
Область видимости переменной ацкий Общие вопросы Javascript 3 27.08.2011 14:09
область видимости Ultimatum Общие вопросы Javascript 2 19.06.2011 10:47
можно ли включить функцию в глобальную область видимости из файла maxval Элементы интерфейса 13 04.10.2009 07:11