Javascript: получить доступ к локальной переменной или переменной в закрытии по имени

Возможный дубликат:
Как получить доступ к локальной области динамически в javascript?

Привет всем.
Мы все знаем, что вы можете получить доступ к свойству объекта javascript по его имени, используя синтаксис []. О.Б. [ 'nameOfProperty'].

Можете ли вы сделать то же самое для локальной переменной? Другой ответ здесь предложил ответить на использование окна ['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();

Ответы

Ответ 1

Я не знаю ничего встроенного в JavaScript для ссылки на такие локальные переменные (хотя, вероятно, следует учитывать, что все переменные внутренне привязаны по строкам).

Я бы предложил сохранить все переменные в объекте, если вам действительно нужен доступ по строке:

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

Обновление: Это меня беспокоит, что нет способа сделать это, как вы хотите. Внутренне переменная является изменяемой привязкой в ​​декларативных отчетах среды. Свойства привязаны к объекту, которым они являются свойством через записи объектной среды, но на самом деле есть доступ к ним с помощью скобок. К сожалению, нет способа доступа к декларативным файлам среды таким же образом.

Ответ 2

Доступ к переменной с окном или любым другим глобальным accessor не будет работать, потому что переменная не доступна глобально. Но вы можете использовать может использовать eval для оценки любого выражения:

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

test();
</script>

Ответ 3

Нет, поскольку переменная доступна только из контекстов выполнения, содержащих область переменных.

Другими словами, единственный способ доступа к j - это доступ к нему из чего-то в области test - через внутреннюю функцию или что-то еще. Это связано с тем, что j в некотором смысле не существует для объектов с более широкой областью, такой как глобальный объект. Если бы это было иначе, то имена переменных были бы глобально уникальными.

Ответ 4

Как насчет:

<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>

Ответ 5

Нет, это вообще невозможно. JavaScript разрешает идентификаторы внутри функции с использованием цепочки областей видимости; нет единого объекта, который содержит все переменные в области видимости, а объекты в цепочке областей видимости недоступны для JavaScript, запущенных на странице.