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, запущенных на странице.