web-dev-qa-db-ja.com

Javascript:ローカル変数またはクロージャ内の変数へのアクセスをその名前で取得します

重複の可能性:
javascriptでローカルスコープに動的にアクセスするにはどうすればよいですか?

こんにちは、みんな。
[]構文を使用して、名前でjavascriptオブジェクトのプロパティにアクセスできることは誰もが知っています。 ob ['nameOfProperty']。

ローカル変数についても同じことができますか?別の答え ここ 答えはwindow ['nameOfVar']を使用することです。ただし、これは投稿者がウィンドウレベルのスコープで変数を定義していたためにのみ機能しました。

FirefoxのFirebug(javascriptで書かれていると思います)はローカル変数とクロージャ変数を表示できるため、これは一般的に可能である必要があると思います。私が知らない隠された言語機能はありますか?

具体的には、これが私がやりたいことです:

 var i = 4;
 console.log(window['i']); // this works..

 function Func(){
     var j = 99;

     // try to output the value of j from its name as a string
     console.log(window['j']); // unsurprisingly, this doesn't work
 }

 Func();
14
Ben Clayton

そのようなローカル変数を参照するためにJavaScriptに組み込まれているものは何も知りません(ただし、すべての変数が文字列によって内部的に参照されていることを考慮する必要があります)。

文字列で本当にアクセスする必要がある場合は、すべての変数をオブジェクトに保持することをお勧めします。

var variables = {
    "j": 1
};
alert(variables["j"]);

更新:あなたが望むようにこれを行う方法がないことは私に一種のバグです。内部的には、変数は宣言型環境レコードの可変バインディングです。プロパティは、オブジェクトの環境レコードを介してプロパティであるオブジェクトにバインドされますが、実際には角かっこを使用してそれらにアクセスする方法があります。残念ながら、宣言型環境レコードに同じ方法でアクセスする方法はありません。

13
Bob

変数はグローバルにアクセスできないため、ウィンドウまたはその他のグローバルアクセサーを使用して変数にアクセスすることはできません。ただし、evalを使用して任意の式を評価できます。

<script>
function test(){
   var j = 1; 
   alert(eval("j"));
}

test();
</script>
7
PanJanek

いいえ。変数には、変数のスコープを含む実行コンテキスト内からのみアクセスできるためです。

言い換えると、jにアクセスできる唯一の方法は、testのスコープ内の何かから内部関数などを介してアクセスする場合です。これは、ある意味で、グローバルオブジェクトのようにスコープが広いオブジェクトにはjが存在しないためです。そうでない場合、変数名はグローバルに一意である必要があります。

2
ntownsend

いいえ、これは一般的には不可能です。 JavaScriptは、スコープチェーンを使用して関数内の識別子を解決します。スコープ内のすべての変数を含む単一のオブジェクトはなく、スコープチェーン内のオブジェクトはページで実行されているJavaScriptからアクセスできません。

2
Tim Down

どうですか:

<script>
    function Func(){
        var fn = arguments.callee;
        fn.j = 99;
        console.log(fn['j']);
    }
    Func();
    console.log(window['j']); //not global
    console.log(Func['j']); //but not private
</script>
2
Mic