2010-07-21 147 views
1

我一直在我的代碼中使用eval,最近我發現可能存在嚴重的安全問題如果eval()在Javascript中使用。最常見的情況是我使用eval()來組成變量名,然後像這樣獲取該變量的值;如何從下面的代碼中刪除eval().... - Javascript

var a = "2"  // could be any value 

work(a); 

function work(a) 
{ 
var l1 = "something"; 
var l2 = "something else"; 
var l3 = "something different"; 

alert(eval("l"+a)); 
// alerts "something else" 
}; 

是否有任何替代的eval()在這樣的情況?

我試過使用窗口[「l」+ a],但只有當變量是全局變量,也是document.getElementById(「l」+ a),並且不起作用。

任何幫助非常感謝。

謝謝, 諾曼。

+1

請注意,當您讓用戶輸入要評估的內容時,'eval'只有*危險*。但這也是不好的做法,在99.9%的情況下可以避免。 – Matchu 2010-07-21 04:56:42

回答

6

也許使用一個對象或一個陣列:

var obj = { 
    '1' : 'something', 
    '2' : 'something else', 
    'foo' : 'entirely different' 
}; 
// access like this: 
obj[1];   // "something" 
obj['foo'];  // "entirely different" 
var key = 'foo'; 
obj[key];   // "entirely different" 

或,作爲陣列:

var arr = [ 
    "something", 
    "something else", 
    "something different" 
]; 
arr[0] // something 
arr[1] // something else 
+1

明確作爲數組。那麼參數只是一個數組索引。 – 2010-07-21 04:57:52

+0

@Eric,是的,我絕對同意這是最好的選擇,但我不確定後綴數字在OP中是否有意義。 – nickf 2010-07-21 06:12:25

4

使用:

window["l"+a] 

例如

var a = "2"  // could be any value 

work(a); 

function work(a) 
{ 
l1 = "something"; 
l2 = "something else"; 
l3 = "something different"; 

alert(window["l"+a]); 
// alerts "something else" 
}; 

或者,可以使用數組或對象符號(優選的,因爲它不污染全局)

var a = "2"  // could be any value 

work(a); 

function work(a) 
{ 
var l = ["something", "something else", "something different" ]; 

alert(l[a]); 
// alerts "something else" 
}; 
1

使用開關

function match(a) 
{ 

switch(a) 
    { 
    case 1: 
    alert("something"); 
    break; 
    case 2: 
    alert("something else"); 
    break; 
    case 3: 
    alert("something different"); 
    break; 
    default: 
    alert("No match!"); 
    } 

}