La citazione nella risposta di Nick suggerisce. Non è davvero una grande differenza, ma la sensazione è che eval
è "peggio" di new Function
. Non in termini di sicurezza - sono entrambi ugualmente inutili di fronte a input non attendibili, ma speriamo che la tua webapp non restituisca stringhe JSON non attendibili - ma in termini di stranezze a livello di linguaggio e quindi di resistenza all'ottimizzazione.
In particolare:
function victim() {
var a= 1;
eval('a= 2');
return a;
}
dà 2
.La stringa eval
ha operato sull'ambito della variabile locale victim
! Questo è qualcosa che una normale funzione scritta dall'utente non potrebbe mai fare; eval
può farlo solo perché è magia oscura.
Utilizzando una funzione regolare invece rimuove questo elemento di magia:
function victim() {
var a= 1;
(new Function('a= 2;'))();
return a;
}
in quanto sopra, la restituito a
rimane 1
; la nuova funzione può operare solo sulle proprie variabili locali o sul globale window.a
.
Questa conoscenza consente agli strumenti di analisi del codice, che potrebbero includere motori JavaScript e minifratori particolarmente intelligenti, di applicare ulteriori ottimizzazioni. Ad esempio la seconda funzione victim
potrebbe avere la variabile a
completamente ottimizzata su return 1
. Un utilizzo di eval
e molte ottimizzazioni potenziali non saranno fattibili.
Naturalmente, in pratica, per una funzione molto piccolo come un JSON eval
ehm, non ci sta per essere una notevole differenza, ma in generale il pensiero è:
- evitare di entrambi gli approcci per quanto possibile (si sono entrambi non consentiti nella modalità Strict della Quinta Edizione di ECMAScript);
- se è necessario utilizzarne uno,
new Function
è preferibile a eval
, a meno che non si abbia realmente bisogno del codice per accedere alle variabili locali della funzione di chiamata.
il male è come eval fa – Anurag