如何在Javascript中获取外部函数的变量

时间:2009-09-24 16:22:08

标签: javascript

如果只允许字符串传入函数process(),我们应该在函数process()内部做什么来访问数组值。 Eval是其中一种方法,但许多人并不建议使用它。

function demo2(name2)
{
 var alpha = [];
 alpha["a"] = "test1";
 var bravo = [];
 bravo["a"] = "test2"; 

 function process(name)
 {
  alert(window[name]["a"]);
 }
 process(name2); // error
    }

name2可以是“alpha”或“bravo”或许多其他数组的名称。

var alpha = [];
 alpha["a"] = "test1";
 var bravo = [];
 bravo["a"] = "test2"; 
    function process(name)
 {
  alert(window[name]["a"]);
 }
    process("alpha");

对于第二个例子,它工作正常。 我只想将字符串传递给函数,并在第一个示例中将其用作数组名称。我有第二个例子,所以我想知道如何在一个函数中做到这一点。

我应该在函数流程中写什么来提醒alpha和bravo变量?

4 个答案:

答案 0 :(得分:2)

这个怎么样?

function demo2()
{
    var alpha = [];
    alpha["a"] = "test1";
    var bravo = [];
    bravo["a"] = "test2"; 

    function process(name)
    {
        alert(name["a"]);
    }
    process(alpha);
    process(bravo);
}

答案 1 :(得分:2)

process可以直接访问alphabravo(不会被传递)。

您无法通过window[name]访问这些变量的原因是因为它们不是全局变量。

function demo2()
{
    var alpha = [];
    alpha["a"] = "test1";
    var bravo = [];
    bravo["a"] = "test2"; 

    function process(name)
    {
        alert(alpha["a"]);
        alert(bravo["a"]);
    }
    process();
}

此外,使用字母数字数组下标有点胜过使用数组的目的(不是说它不可能)。具有非数字下标的元素不在所有内置数组函数中(例如join,slice,shift)。

您可以为此目的使用普通对象。

var obj = {};
obj.a = "test";   //OR
obj["a"] = "test"; 

[编辑] :响应您的评论,几乎没有充分理由使用包含其名称的字符串来引用变量。但是如果你这样做,你可以考虑制作一个对象的所有数组属性。这与引用window [“something”]相同,如果它们是全局变量,除非您是具有自己对象的替换窗口。

function demo2()
{
    var container = {};
    container.alpha = [];
    container.alpha["a"] = "test1";
    container.bravo = [];
    container.bravo["a"] = "test2"; 

    function process(name)
    {
        alert(container[name]["a"]);
    }
    process("alpha");
    process("bravo");
}

答案 2 :(得分:0)

function demo2()
{
var alpha = [];
alpha["a"] = "test1";
var bravo = [];
bravo["a"] = "test2"; 

function process(name)
{
        var x = eval(name);
        alert(x["a"]);
}
process("alpha");
process("bravo");

}

答案 3 :(得分:0)

回答你的问题:

function process(name) {
        alert(eval(name+'["a"]'));
}

免责声明:如果你没有充分的理由这样做,我会重构你的范围 - 这很难看。