2009-09-24 37 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"]')); 
} 

免責聲明:如果你沒有一個很好的理由這樣做,我會重構你的作用域 - 這是很醜陋的。

相關問題