ローカル変数を動的に作成したい。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なしでそれを行うことは可能ですか?
編集: 04-7 月
やあ、
@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>
これはすべてうまくいきます。しかし、実際には、関数内で変数を作成するのではなく、グローバル変数を作成しています。
createVariables() 関数に渡される「self」はウィンドウです。なぜそれが起こっているのかわかりません。関数スコープを自己に割り当てています。ここで何が起こっているのかわかりません。この場合、とにかくグローバル変数を作成しています。
私の質問が明確でない場合は、
私が求めているのは、呼び出し元でローカル変数を作成することです。シナリオはこんな感じ
1) 私は関数の中にいます。
2) マップを返す別の関数を呼び出します [このマップには、変数の名前と値が含まれています]。
3) 変数がまだ定義されていない場合は、すべての変数を動的に作成したいと考えています。[グローバル/ローカル] で既に定義されている場合は、それらを更新したいと思います。
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>