2010-07-21 152 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!"); 
    } 

}