2009-09-24 68 views
0

如果只允许字符串传递到函数process()中,那么我们应该在函数process()中执行哪些操作来访问数组值。 Eval是其中一种方法,但它的用法并不是很多人提出的建议。如何在Javascript中获得外部函数的变量

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变量?

回答

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(); 
} 

此外,使用字母数字下标有点击败使用数组的目的(不是这是不可能的)。带有非数字下标的元素不包含所有内置数组函数(如连接,切片,移位)。

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

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"); 
} 
+0

我知道我们可以直接访问数组。我刚刚改变了这个问题。希望你明白我想要什么。 – Billy 2009-09-24 16:40:23

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"); 

} 
+1

Eval应该避免。 – lod3n 2009-09-24 16:30:37

+0

应避免使用Topicstarter的情况) 不明白为什么不在闭包中使用局部变量。 – Anatoliy 2009-09-24 16:34:01

+0

我想要的就是这样的情况。 如果只允许字符串传入函数process(),那么我们应该在函数process()中做什么来访问数组值。 Eval是其中一种方法,但它的用法并不是很多人提出的建议。 – Billy 2009-09-24 16:46:08

2

这是怎么回事?

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

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

要回答你的问题:

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

免责声明:如果你没有一个很好的理由这样做,我会重构你的作用域 - 这是很丑陋的。