2009-10-20 13 views
6

Powiel możliwe:
When is JavaScript’s eval() not evil?Jaki jest cel ewalu w JavaScript?

wiem, na ogół przy użyciu eval() jest złą praktyką.

Ale w jakim celu on tam istnieje?

Jaki jest właściwy cel eval()?

W jakiej sytuacji lepiej jest użyć eval()?

+1

http://en.wikipedia.org/wiki/Eval#JavaScript –

+10

To jest po prostu błędnie napisane 'evil()'.Nie używaj go. – slikts

+1

* rollseyes * eval niekoniecznie jest zły, wszystko zależy od tego, do czego zamierzasz go użyć, a czasami naprawdę nie ma innego sposobu. –

Odpowiedz

8

eval

Ocenia ciąg kodu JavaScript bez odniesienia do konkretnego obiektu.

Jeśli skonstruujesz wyrażenie arytmetyczne jako ciąg, możesz użyć eval, aby ocenić go później. Załóżmy na przykład, że masz zmienną x. Możesz odroczyć ocenę wyrażenia obejmującego x, przypisując wartość ciągu wyrażenia, powiedz "3 * x + 2", do zmiennej, a następnie wywołując eval w późniejszym punkcie skryptu.

Bądź ostrożny używając eval

eval() jest niebezpieczną funkcję, która wykonuje kod to przekazywane z uprawnieniami rozmówcy. Jeśli uruchomisz eval() z ciągiem, który może zostać dotknięty przez szkodliwą stronę, możesz skończyć uruchamiając złośliwy kod na komputerze użytkownika z uprawnieniami twojej strony/rozszerzenia.

+0

+1 Ta odpowiedź wydaje mi się OK, więc przegłosowałem ją. Kto obejrzał się, powinien wyjaśnić dlaczego. –

+0

Czy znajduje się odpowiedź "Nie korzystaj z eval"? – rahul

+0

Nie wiem, ale odpowiedź była dziwna. Wygląda na to, że odszedł teraz. –

2

Możesz chcieć sprawdzić this article, poniżej jest bezpośredni cytat ze strony, która podsumowuje moc eval.

Komenda JavaScript EVAL może być bardzo wydajne przy użyciu dynamicznego treści w aplikacjach webowych. EVAL może zmniejszyć kod i ułatwia interakcję z danymi nieznanymi przy czasie ładowania, ale istnieją pewne wady, które należy wziąć pod uwagę pod adresem .

Prawdziwa siła tego polecenia jest jego zdolność do pracy z danymi, które nie znany jest na przykład w czasie do obciążenia, danych wprowadzonych przez użytkownika. Jak już wspomniałem , EVAL przyjmuje dowolny ciąg, który podasz , i wykonuje go zwracając wynik, jeśli jest odpowiedni. Możesz użyć tego do wykonania skryptu JavaScript , w którym wykonanie zapytania do wykonania nie jest znane podczas ładowania. Dla przykładu, jeśli mamy skrypt obliczeniowy , który przyjmuje równanie dostarczone przez użytkownika i zwraca wynik, możesz może użyć EVAL, aby wykonać obliczenia .

+0

To 'eval', a nie' EVAL'. –

+0

Naprawdę ?! To jest cytat. Wyślij swoje skargi do autora. –

+0

Mam świadomość, że to cytat, ale zdecydowałeś się zacytować go w swojej odpowiedzi. Jestem pewien, że nikt nie będzie się mylił z użyciem wielkich liter w kontekście tego pytania, ale jest to dziwny sposób na przedstawienie nazwy funkcji w języku, w którym w nazwach funkcji rozróżniana jest wielkość liter. –

1

Nie sądzę, że jest tak źle używać tego jako niebezpiecznego. Ludzie mówią, że nie używają eval, ponieważ otwierają luki do nadużyć. Można go używać, jeśli dane wejściowe są bezpieczne. Jest on używany na przykład w Doug Crockford's JSON parser, po sprawdzeniu wejścia za pomocą wyrażenia regularnego, aby upewnić się, że nie ma "niebezpiecznych" treści.

Innym powodem, dla którego ludzie mówią, że nie należy go używać, jest to, że jeśli użyjesz eval zbyt wiele, ludzie zaczną nazywać cię Eval Knievel.

8

eval() zapewnia dostęp do kompilatora JavaScript, co w ostatecznym rozrachunku umożliwia wykonanie kodu w późniejszym czasie. Argumenty przekazane do funkcji przekazywane są do kompilatora JavaScript, po którym następuje wykonanie kodu.

Deweloperzy kłócą się o bezpieczeństwo eval(). To jest mniej bezpieczne, ale jeśli jesteś absolutnie pewien, że twoje dane wejściowe są oczyszczone przed przekazaniem go dalej, to nie powinno być problemu.

Ponadto wyniki eval() są generalnie wolniejsze, ponieważ kod nie został jeszcze skompilowany ani zapisany w pamięci podręcznej. Prawdopodobnie wystąpi uderzenie wydajności przy korzystaniu z tej funkcji.

Trudno jest również zdebugować kod, który wynika z użycia eval(), ponieważ istnieje niewiele informacji o kontekście (numer linii myślowej) dotyczących kodu, który jest ostatecznie wykonywany.

Pod względem rozwoju sieci, jednym z najbardziej popularnych zastosowań eval() jest deserializacja łańcucha JSON zwykle w kontekście aplikacji Ajax; nie oznacza to jednak, że nie ma wielu innych zastosowań.

+0

Najbardziej lubię tę odpowiedź - brak BS, tylko inteligentnie napisana odpowiedź :) –

0

Niedawno eksperymentowałem z poleceniem eval(), próbując wymyślić nową konwencję dla nowego projektu.

Co chciałem było to: Spodobał mi się pomysł posiadania prywatną, publicznego i uprzywilejowane metod, Ala. Doug Crockford's article, ale chciałem być w stanie ujawnić publiczne metody/zmienne na Górze moich klas, a nie na dole, jak zwykle.

Rozważ to:

var Singleton = function() { 
    // Private 
    function _one() { 
     // code... 
    } 

    function _two() { 
     // code... 
    } 

    // Public 
    return { 
     one: _one, 
     two: _two 
    }; 
}(); 

Z trzech eval() „s (dwa zagnieżdżone wewnątrz budynku głównego) udało mi się mieć tę składnię:

var Singleton = function() { 
    // Public 
    var $interface = { 
     one: $forward, 
     two: $forward 
    }; 

    // Private 
    function _one() { 
     // code... 
    } 

    function _two() { 
     // code... 
    } 

    // This does the magic 
    return eval($init); 
}('Singleton'); 

i wbrew wszelkim przeciwnościom i common- poczucie, że zadziałało. (Zauważ, że chciałem również znaleźć sposób na debugowanie moich przestrzeni nazw, dlatego możesz zobaczyć ciąg przekazany do singletonu.) $init również to zajął.)

W każdym razie, myślę, że pisanie tego wszystkiego to znaczy to, że eval() niekoniecznie jest cholernie szkodliwym działaniem ściółki JavaScript, którego należy unikać za wszelką cenę, i może być używane na więcej sposobów niż tylko na (zaufany!) kod wysyłany z serwera i dekompresowanie JSON.

(Chociaż w moim przypadku skończyło się jako psychicznego treningu, jak ja, ponieważ przekonałem się nie męczyć się z prywatnego metod/zmienne po wszystkim i po prostu użyć ścisłe konwencję przestrzeni nazw.)