15

重複の可能性:
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();
4

5 に答える 5

15

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

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

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

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

于 2010-02-25T18:51:55.117 に答える
8

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

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

test();
</script>
于 2010-02-25T18:39:24.457 に答える
2

どうですか:

<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>
于 2010-02-25T18:59:48.187 に答える
2

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

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

于 2010-02-25T18:42:40.330 に答える
2

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

于 2010-02-25T19:28:35.647 に答える