2012-05-06 20 views
20

Wiem, że to może być pytanie dla początkujących, ale jestem ciekawa co do głównej korzyści z eval() - gdzie byłby najlepiej wykorzystany? Doceniam wszelkie informacje.Jakie są główne zalety korzystania z eval() w JavaScript?

+3

możliwy duplikat [Czy istnieje jakikolwiek powód, by używać eval()?] (Http://stackoverflow.com/questions/1826859/is-there-ever-a-good-reason-to-use-eval) –

+1

Dlaczego jest to oznaczone? 'praca domowa'? –

+0

@Derek - dzięki, naprawiono – Coffee

Odpowiedz

23

Najlepiej użyć funkcji eval: Nigdy.

Jego celem jest ocena łańcucha jako wyrażenia JavaScript. Przykład:

eval('x = 42'); 

Został użyty dużo wcześniej, ponieważ wiele osób nie wie jak napisać odpowiedni kod dla tego, co chciałem zrobić. Na przykład w przypadku korzystania z dynamicznego nazwę pola:

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

Właściwym sposobem na to byłoby:

document.frm[frmName].value = text; 

Jako metodę eval wykonuje ciąg jako kod, za każdym razem, że jest ona wykorzystywana jest potencjalnym otwarciem dla kogoś, kto wstrzyknie szkodliwy kod na stronę. Zobacz cross-site scripting.

Istnieje kilka uzasadnionych zastosowań funkcji eval.Jest jednak mało prawdopodobne, że kiedykolwiek będziesz w sytuacji, w której będziesz go potrzebować.

7

eval() nie powinno być używane w JavaScript.

eval() był używany do analizowania ciągów JSON, ale to użycie zostało zastąpione przez szybszy i bezpieczniejszy JSON.parseJSON.

+0

Ach, rozumiem - więc jest to ryzykowna funkcja - będę czytać więcej. Dziękuję, – Coffee

+1

Funkcja 'eval' została użyta dla wielu rzeczy zanim JSON istniał ... – Guffa

+2

@Guffa: Tak, ale nie powinno. – SLaks

2

Możesz uruchomić JS, który jest przechowywany w wartości pola na stronie.

Możesz używać eval z JS, po prostu twój kod jest bardziej przydatny do ataku. Dopóki nie korzysta z AJAX, nie ma problemu z serwerem.

Jeśli używasz eval, należy analizować na znaki [() <> {}]

+4

To generalnie okropny pomysł. – SLaks

+0

Biblioteki JS promują to cały czas, więc to musi być dobra praktyka! –

+0

Nie jest tak źle, dopóki nie używasz go w stanie surowym. – PitaJ

1

eval() = evil

Nie należy używać go naprawdę w ogóle. Można go użyć do łatwego wstawiania kodu, ale ktoś może wstawić złe skrypty za pomocą eval(). Czasami ludzie używają eval() do analizowania JSON, lub

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

ale rzeczywiście można osiągnąć wszystkie te rzeczy bez użycia eval().

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

Wszyscy wiemy, że nie powinieneś używać 'eval'; OP pytał, czy istnieją jakieś korzyści. –

+0

@JeffreySweeney - (nie ma żadnego z nich, o czym mogę myśleć ...) –

+0

Wiem, prawda? : P Być może można go wykorzystać do testowania luki w zabezpieczeniach na serwerze testowym lub do testowania szybkości (ponieważ jest to jedna z najwolniejszych funkcji w JS). –

7

eval umożliwia wykonanie (lub oceny) ciąg kodu javascript.

W ten sposób ma zastosowanie, gdy chcemy, aby ktoś wykonał ciąg kodu javascript. Jak na przykład w edukacyjnym artykule na temat JavaScript, więc czytelnik może natychmiast go wypróbować :)

Lub, jeśli twoja strona jest skierowana do programistów, możesz chcieć, aby napisali i uruchomili własne wtyczki.

2

Najlepszym celem używania eval jest dynamiczne ładowanie kodu, generowanie kodu w czasie wykonywania i wykonywanie podobnych czynności związanych z metadanymi. Ogólnie rzecz biorąc, jeśli możesz zrobić to samo bez ewaluacji, nie używaj eval.

0

Jednym z najlepszych przypadków użycia eval jest rejestr javascript, w którym użytkownik może wykonywać javascript w czasie wykonywania. na przykład javascript logger pozwalając użytkownikowi na wykonanie skryptu w oknie rejestratora.

0

można zbudować szkielet klienta i uruchomić go jako aplikację podstawową - otrzymywać pakiety kodu, a następnie wykonywać je - co powoduje, że klient jest wyjątkowo elastyczny - mając cały kod na serwerze w pakietach. Jest to jednak bardzo ryzykowne i jeśli coś takiego jest potrzebne, być może powinieneś używać Java z pakietami Java. Dlaczego Eval jest nadal w języku jest dyskusyjna, to jest zbyt duże zagrożenie dla bezpieczeństwa w użyciu

2

Jak wspomniano wcześniej, istnieje potencjalne ryzyko związane podczas korzystania z funkcji eval(), Jeśli chcesz ocenić ciąg jako wyrazu ty może użyć $ {} do ewaluacji wyrażenia, wprowadzonej w ECMA-6

11

To jest dość stare pytanie i być może ludzie nie myśleli o przypadkach użycia dla eval() prawidłowo w tym czasie. Jednym wielkim pożytkiem dla eval() jest zaimplementowanie hot reloading do twojego backendu lub programu rozwojowego frontend.

Zasadniczo eval() może umożliwiać edytowanie kodu w edytorze, a także łatanie uruchomionej aplikacji bez ponownego uruchamiania i bez utraty stanu (w zależności od implementacji). Potrzebny będzie powiązany kod, który będzie śledził zmiany w plikach, i w jakiś sposób prześle zmiany do aplikacji, ale ostatecznie jest to metoda przekształcania tych zmian w rzeczywisty js.


W tym pamiętać, myślę, że to jest całkowicie błędne napisać oświadczenie jak eval() jest zła, czy nie powinien być stosowany. Powszechne stwierdzenia takie jak te są prawdziwym złem!

+0

Jest to najlepszy i rzeczywisty przypadek użycia, który spotkałem. (y) – Ravi

+0

Zgrabna odpowiedź. Jeśli ktoś budował coś takiego jak ReactJS lub Angular lub NodeJS, ta odpowiedź byłaby przydatna. =) – HoldOffHunger

0

Może się mylę, ale używam go przekonwertować klasyczny ciąg na ciąg ES6 Szablon:

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

co daje mi to, czego potrzebuję:

"Hello Daman" 
Powiązane problemy