可能重复:
How can I access local scope dynamically in javascript?
大家好。
我们都知道您可以使用[]语法通过它的名称访问javascript对象的属性。 OB [ 'nameOfProperty']。
你能为局部变量做同样的事吗?另一个答案here建议答案是使用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();
答案 0 :(得分:13)
我不知道JavaScript内置任何引用类似的局部变量(尽管可能应该考虑所有变量都由字符串内部引用)。
如果您真的需要通过字符串访问,我建议将所有变量保存在对象中:
var variables = {
"j": 1
};
alert(variables["j"]);
更新:有点不好意思,没有办法像你想要的那样做。在内部,变量是声明性环境记录中的可变绑定。属性通过对象的环境记录绑定到它们是属性的对象,但实际上有一种方法可以使用括号来访问它们。不幸的是,没有办法以相同的方式访问声明性环境记录。
答案 1 :(得分:7)
使用窗口或任何其他全局访问器访问变量将不起作用,因为该变量不可全局访问。但您可以使用eval来评估任何表达式:
<script>
function test(){
var j = 1;
alert(eval("j"));
}
test();
</script>
答案 2 :(得分:2)
不,因为只能从包含变量范围的执行上下文中访问该变量。
换句话说,唯一可以访问j
的方法是,如果您从test
范围内的某些内容访问它 - 通过内部函数或其他方式。这是因为j
在某种意义上对于具有更宽范围的对象(如全局对象)不存在。如果不是这样,那么变量名称必须全局唯一。
答案 3 :(得分: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>
答案 4 :(得分:2)
不,一般来说这是不可能的。 JavaScript使用作用域链解析函数内的标识符;没有单个对象包含范围内的所有变量,并且范围链中的对象无法从页面中运行的JavaScript中访问。