按字面变量名访问变量(eval和likes除外)



假设我有一个变量,其中包含另一个变量的名称

var foo='varname'

我想得到varname 的值

如果varname是全局的,我可以做window[foo],但varname不是全局的。

如果这是一个个人项目,我会毫不回头地做eval(foo),但在专业环境中,eval总是不受欢迎,所以我试图首先收集所有可用的选项,看看是否可以避免。

我能想到的唯一替代方案是Function('return '+ foo)(),但这感觉很像eval

我认为答案是否定的,但有没有任何方法可以使用平方符号或类似的"安全"方法来引用一个变量,该变量不是对象的属性?

谢谢

--更多上下文——

变量是在主函数中设置的。要评估的条件来自json文件。大体上,在获得json之后,对条件进行评估。如果条件得到满足,就会发生一些事情。条件采用json格式,如{cond1:{varname:'somevalue'}}。我想测试varname==='somevalue'

我认为答案是否定的,但有没有任何方法可以使用平方符号或类似的"安全"方法来引用一个不是全局的变量?

你是对的:答案是否定的。相反,使用一个对象和一个属性:

var vars = {
    foo: "bar"
};
var varname = "foo";
snippet.log(vars[varname]); // "bar"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

如果你想加入一些通常不受欢迎的其他,你可以将其与with语句结合起来,得到看起来像变量,但实际上是属性的东西:

var vars = {
    foo: "bar",
    baz: "buz"
    // ...and so on
};
var varname = "foo";
with (vars) {
    snippet.log(vars[varname]); // "bar"
    // Looks like a variable:
    foo = "updated";
    snippet.log(vars[varname]); // "updated"
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

我不是推荐,只是想给你选择。:-)

嘿,你可以用一个数组来做这件事,一个简单的

(function(){
    var foo="varname";
    var arr=[];
     function ls(){
        arr["varname"]="soy varname";
         console.log(arr[foo]);
    }
    ls();
})();

http://jsfiddle.net/bbsw99g8/

最新更新