2010-07-21 3 views
1

J'ai utilisé eval dans mon code et j'ai récemment découvert qu'il peut y avoir de sérieux problèmes de sécurité Si eval() est utilisé dans Javascript. Le scénario le plus courant est celui où j'utilise eval() pour composer un nom de variable et ensuite obtenir la valeur de cette variable comme ici;Comment puis-je supprimer eval() du code suivant .... - 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" 
}; 

Existe-t-il des alternatives à eval() dans une telle situation?

J'ai essayé d'utiliser window ["l" + a] mais cela ne fonctionnera que si les variables sont globales et aussi document.getElementById ("l" + a) et que cela ne marche pas non plus.

Toute aide grandement appréciée.

Merci, Norman.

+1

Notez que 'eval' est seulement * dangereux * lorsque vous laissez l'utilisateur entrer quelque chose qui est évalué. Mais c'est aussi une mauvaise pratique, évitable dans 99,9% des cas. – Matchu

Répondre

6

peut-être utiliser un objet ou un tableau:

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" 

ou en tant que matrice:

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

certainement comme le tableau. alors le paramètre est juste un index de tableau. –

+0

@Eric, oui je suis définitivement d'accord que c'est la meilleure option, même si je ne savais pas si les nombres suffixés étaient significatifs dans l'OP. – nickf

4

utilisation:

window["l"+a] 

par exemple,

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

Sinon, vous pouvez utiliser une notation de tableau ou un objet (préféré car il ne pollue pas global)

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

utiliser un commutateur

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

}