Я хочу создать локальную переменную динамически. JavaScript: динамическое создание переменных для циклов - это не совсем то, что я ищу. Я не хочу массив. Я хочу получить к нему доступ как локальную переменную.
Что-то вроде:
<script type="text/javascript">
var properties = new Object();
properties["var1"] = "value1";
properties["var2"] = "value2";
createVariables(properties);
function createVariables(properties)
{
// This function should somehow create variables in the calling function. Is there a way to do that?
}
document.write("Outside the function : " + var1 + "<br>");
document.write("Outside the function : " + var2 + "<br>");
</script>
Я попробовал следующий код.
<script type="text/javascript">
var properties = new Object();
properties["var1"] = "value1";
properties["var2"] = "value2";
createVariables(properties);
function createVariables(properties)
{
for( var variable in properties)
{
try
{
eval(variable);
eval(variable + " = " + properties[variable] + ";");
}
catch(e)
{
eval("var " + variable + " = '" + properties[variable] + "';");
}
}
document.write("Inside the function : " + var1 + "<br>");
document.write("Inside the function : " + var2 + "<br>");
}
document.write("Outside the function : " + var1 + "<br>");
document.write("Outside the function : " + var2 + "<br>");
</script>
Но сгенерированные переменные недоступны вне createVariables().
Теперь у меня есть это решение.
<script type="text/javascript">
var properties = new Object();
properties["var1"] = "value1";
properties["var2"] = "value2";
function createVariables(properties)
{
var str = "";
for( var variable in properties)
{
str += "try{";
str += "eval('" + variable + "');";
str += "eval(\"" + variable + " = properties['" + variable + "'];\");";
str += "}";
str += "catch(e){";
str += "eval(\"var " + variable + " = properties['" + variable + "'];\");";
str += "}";
}
return str;
}
eval(createVariables(properties));
document.write("Outside the function : " + var1 + "<br>");
document.write("Outside the function : " + var2 + "<br>");
</script>
Это работает. Но я ищу альтернативное/лучшее решение. Можно ли это сделать без eval?
EDIT: 04-July
Привет,
Я попробовал решение, подобное тому, что предложил @Jonathan.
<script type="text/javascript">
var startFunc = function(){
var self = this;
self.innerFunc = function innerFunc(){
var properties = new Object();
properties["var1"] = "value1";
properties["var2"] = "value2";
properties["var3"] = "value3";
function createVariables(caller, props) {
for(i in props) {
caller[i] = props[i];
}
caller.func1();
}
createVariables(self, properties);
console.log( var1 );
}
self.func1 = function func1(){
console.log( "In func 1" );
console.log( var2 );
}
innerFunc();
console.log( var3 );
}
startFunc();
</script>
Все это прекрасно работает. Но на самом деле он создает глобальные переменные вместо создания переменных в функции.
"self", переданный функции createVariables(), является окном. Я не уверен, почему это происходит. Я назначаю область действия самому себе. Я не уверен, что здесь происходит. В любом случае это создает глобальные переменные.
Если мой вопрос не ясен,
То, что я делаю, создает локальные переменные в вызывающем. Сценарий похож на
1) Я внутри функции.
2) Я вызываю другую функцию, которая возвращает мне карту. [Эта карта содержит имя и значение переменной].
3) Я хочу динамически создавать все переменные, если они еще не определены. Если они уже определены [global/local], я хочу их обновить.
4) После создания этих переменных я должен иметь доступ к ним без какого-либо контекста. [Просто имя переменной]
<script type="text/javascript">
function mainFunc()
{
var varibalesToBeCreated = getVariables();
createVariables(varibalesToBeCreated);
alert(var1);
alert(var2);
}
function createVariables(varibalesToBeCreated)
{
// How can I implement this function,
// such that the variables are created in the caller?
// I don't want these variables this function.
}
function getVariables()
{
var properties = new Object();
properties["var1"] = "value1";
properties["var2"] = "value2";
}
mainFunc();
</script>