2012-05-06 15 views
20

So che questa potrebbe essere una domanda per principianti, ma sono curioso del vantaggio principale di eval() - dove verrebbe usato meglio? Apprezzo qualsiasi informazione.Qual è il vantaggio principale dell'utilizzo di eval() in JavaScript?

+3

possibile duplicato [C'è mai una buona ragione per usare eval()?] (Http://stackoverflow.com/questions/1826859/is-there-ever-a-good-reason-to-use-eval) –

+1

Perché è taggato 'compiti a casa'? –

+0

@Derek - grazie, corretto – Coffee

risposta

23

La funzione eval è la migliore utilizzata: Mai.

Lo scopo è valutare una stringa come espressione di Javascript. Esempio:

eval('x = 42'); 

E 'stato utilizzato molto prima, perché un sacco di gente non sapeva come scrivere il codice appropriato per quello che volevano fare. Per esempio quando si utilizza un nome dinamico per un campo:

eval('document.frm.'+frmName).value = text; 

Il modo corretto per farlo potrebbe essere:

document.frm[frmName].value = text; 

Poiché il metodo eval esegue la stringa come codice, ogni volta che viene utilizzato è una potenziale apertura per qualcuno per iniettare codice dannoso nella pagina. Vedi cross-site scripting.

Esistono alcuni usi legittimi per la funzione eval.Tuttavia, è improbabile che tu ti trovi in ​​una situazione in cui ne avresti effettivamente bisogno.

7

eval() non deve essere utilizzato in Javascript.

eval() utilizzato per analizzare stringhe JSON, ma tale utilizzo è stato sostituito dal più veloce e più sicuro JSON.parseJSON.

+0

Ah, capisco - quindi è una funzione rischiosa - leggerò di più. Grazie, – Coffee

+1

La funzione 'eval' è stata utilizzata per molte cose prima dell'esistenza di JSON ... – Guffa

+2

@Guffa: Sì, ma non avrebbe dovuto essere. – SLaks

2

È possibile eseguire JS memorizzato nel valore di un campo nella pagina Web.

È possibile utilizzare eval con JS, è solo che quindi il codice è più praticabile per attaccare. Finché non usa AJAX, non ci sono problemi con il server.

Se si utilizza eval, si dovrebbe analizzare i personaggi [() <> {}]

+4

E questa è generalmente una pessima idea. – SLaks

+0

Le librerie JS lo promuovono continuamente, quindi deve essere una buona pratica! –

+0

Non è male finché non lo usi crudo – PitaJ

1

eval() = evil

Non si dovrebbe davvero usare affatto. Può essere utilizzato per inserire codice semplice, ma qualcuno può inserire script non validi utilizzando eval(). A volte la gente usa eval() per il parsing di JSON, o

eval("obj." + id); //newbies 

, ma in realtà è possibile ottenere tutte quelle cose senza usare eval().

obj[id];    //should-do 
+0

Sappiamo tutti che non si dovrebbe usare 'eval'; l'OP chiedeva se ci fossero dei benefici. –

+0

@JeffreySweeney - (non ce n'è uno di quelli che riesco a pensare ...) –

+0

Lo so giusto? : P Forse potrebbe essere utilizzato per testare la vulnerabilità back-end su un server di test o per test di velocità (poiché è una delle funzioni più lente in JS). –

7

eval permette di eseguire (o valutare) una stringa di codice JavaScript.

Pertanto, è applicabile quando si desidera che qualcuno esegua una stringa di codice javascript. Ad esempio, in un articolo didattico su JavaScript, il lettore può immediatamente provarlo :)

Oppure, se il tuo sito web è indirizzato ai programmatori, potresti volere che scrivano ed eseguano i propri plugin.

2

L'obiettivo migliore dell'utilizzo di eval è caricare dinamicamente il codice, generare codice in fase di runtime e svolgere attività di meta-programmazione simili. In generale, se puoi fare lo stesso senza eval, non usare eval.

0

uno dei migliori casi d'uso utilizzando eval è logger javascript in cui l'utente può eseguire javascript in fase di esecuzione. ad esempio javascript logger che consente all'utente di eseguire lo script nella finestra del logger.

0

è possibile creare uno scheletro del client e farlo funzionare come app di base - ricevere pacchetti di codice e quindi eseguirli - rendendo così il client estremamente flessibile - avendo tutto il codice sul server in bundle. Questo è comunque molto rischioso e se è necessaria una cosa del genere, dovresti forse usare Java con i bundle Java. Perchè Eval è ancora nella lingua è discutibile, è un troppo grande rischio per la sicurezza di utilizzare

2

Come detto in precedenza, v'è un potenziale rischio durante l'utilizzo di eval(), Se si desidera valutare stringa come espressione che può usare $ {} per esprimere l'espressione, introdotto in ECMA-6

11

Questa è una domanda piuttosto vecchia, e forse la gente non ha pensato correttamente ai casi d'uso per eval() in quel momento. Un ottimo utilizzo per eval() è per l'implementazione del hot ricaricamento nel flusso di sviluppo backend o frontend.

Fondamentalmente eval() può rendere possibile la modifica del codice nell'editor e il patch dell'applicazione in esecuzione senza riavviarlo e senza perdere lo stato (a seconda dell'implementazione). Avrai bisogno del codice associato che controlla le modifiche ai file e in qualche modo invia le modifiche alla tua applicazione, ma il eval() è in definitiva il metodo per convertire tali modifiche in js effettivi.


In tal senso, credo che sia del tutto sbagliato a scrivere una dichiarazione come eval() è il male, o non dovrebbe mai essere utilizzato. Dichiarazioni generali come queste sono il vero male!

+0

Questo è il caso migliore e reale in cui mi sono imbattuto. (y) – Ravi

+0

Risposta chiara. Se qualcuno stava costruendo qualcosa come ReactJS o Angular o NodeJS, questa risposta sarebbe utile. =) – HoldOffHunger

0

Forse mi sbaglio, ma io sto usando per convertire una stringa classico in una stringa ES6 modello:

let name = 'Daman' 
let classicString = 'Hello ${name}' 
let templateString = eval('`' + classicString + '`') 

che mi dà proprio quello che mi serve:

"Hello Daman" 
Problemi correlati