Dokumentacja języka JavaScript 1.5:Funkcje:eval
z Mozilla Developer Center, polskiego centrum programistów Mozilli.
Spis treści |
[edytuj] Podsumowanie
Funkcja główna
Interpretuje i wykonuje kod JavaScript zawarty w łańcuchu znaków, bez odniesienia do żadnego konkretnego obiektu.
[edytuj] Składnia
eval(ciąg znaków, [obiekt])
[edytuj] Parametry
-
ciąg znaków - Łańcuch znaków reprezentujący wyrażenie, instrukcję lub sekwencję instrukcji JavaScript. Wyrażenie może zawierać zmienne i własności istniejących obiektów.
-
obiekt - Argument opcjonalny; jeżeli podano, interpretacja jest ograniczana do otoczenia określonego obiektu.
[edytuj] Opis
eval jest funkcją najwyższego poziomu, niepowiązaną z żadnym obiektem.
Argumentem funkcji eval jest łańcuch znaków. Jeśli łańcuch znaków reprezentuje wyrażenie, funkcja eval oblicza jego wartość. Jeśli argument reprezentuje jedną lub kilka instrukcji JavaScript, eval wykonuje je. Nie wywołujmy eval, aby wykonać wyrażenie arytmetyczne; JavaScript oblicza je automatycznie .
Jeśli utworzymy wyrażenie arytmetyczne jako łańcuch znaków, możemy użyć eval, aby obliczyć je w późniejszym czasie. Na przykład, przypuśćmy że mamy zmienną x. Możemy przełożyć obliczenie wyrażenia zawierającego x w czasie poprzez przypisanie łańcucha znaków z wartością wyrażenia do zmiennej, na przykład, "3 * x + 2" , i wywołać funkcję eval w późniejszym punkcie skryptu.
Jeśli argument eval nie jest łańcuchem znaków, eval zwróci niezmieniony argument. W poniższym przykładzie podany jest konstruktor String, więc eval zwraca obiekt String zamiast wykonania instrukcji z łańcucha znaków.
eval(new String("2+2")); // zwraca obiekt String zawierający wartość "2+2"
eval("2+2"); // zwraca 4
Można obejść to ograniczenie , poprzez użycie metody toString.
var expression = new String("2 + 2");
eval(expression.toString());
Nie można używać funkcji eval pośrednio poprzez wywołanie jej przez inną nazwę niż eval. W przeciwnym wypadku może wystąpić błąd czasu wykonania. Przykładowo, nie powinno się używać poniższego kodu:
var x = 2;
var y = 4;
var mojEval = eval;
mojEval("x + y");
Nie powinno się używać funkcji eval do przekształcania nazw własności do własności. Przyjrzyjmy się następującemu przykładowi. Funkcja getFieldName(n) zwraca nazwę określonego elementu formularza w postaci łańcucha znaków. Pierwsza instrukcja przypisuje zmiennej field nazwę trzeciego elementu formularza. Instrukcja druga używa eval do wyświetlenia wartości formularza.
var pole = getFieldName(3);
document.write("Pole o nazwie ", pole, " ma wartość ",
eval(pole + ".value"));
Jednakże funkcja eval nie jest tu konieczna. W rzeczywistości, jej użycie jest niezalecane. Zamiast, użyjmy znacznie szybszych operatorów pamięci:
var pole = getFieldName(3);
document.write("Pole o nazwie ", pole, " ma wartość ",
pole[value]);
[edytuj] Zgodność wsteczna
[edytuj] JavaScript 1.3 i wersje wcześniejsze
Możesz użyć eval pośrednio, jakkolwiek nie jest to zalecane.
[edytuj] JavaScript 1.1
eval jest również metodą wszystkich obiektów.
[edytuj] Przykłady
Poniższe przykłady wyświetlają dane wyjściowe używając document.write. Po stronie serwera można wyświetlić te same dane wyjściowe za pomocą funkcji write zamiast używać document.write.
[edytuj] Przykład: Zastosowanie eval
W poniższym kodzie, obydwie instrukcje zawierające eval zwracają 42. Pierwsza z nich oblicza wyrażenie z ciągu "x + y + 1"; druga oblicza wartość "42".
var x = 2;
var y = 39;
var z = "42";
eval("x + y + 1"); // zwraca 42
eval(z); // zwraca 42
[edytuj] Przykład: Zastosowanie eval do przetwarzania łańcucha instrukcji JavaScriptu
Poniższy przykład używa eval do interpretowania łańcucha znaków str. Ten łańcuch znaków zawiera kilka instrukcji JavaScript które otwierają okno dialogowe Alert i przypisują zmiennej z wartość 42 (jeśli x jest równe 5) lub 0 (w przeciwnym wypadku). Gdy druga instrukcja jest wykonywana, eval spowoduje iż te instrukcje będą zinterpretowane i wykonane, także zostaną zinterpretowane zestawy instrukcji i zwrócona zostanie wartość przypisana do z.
var str = "if (x == 5) {alert('z jest równe 42'); z = 42;} else z = 0; ";
document.write("<P>z jest równe ", eval(str));
[edytuj] Zwracana wartość
eval zwraca ostateczną wartość obliczonego wyrażenia.
var str = "if ( a ) { 1+1; } else { 1+2; }"
var a = true;
var b = eval(str); // zwraca 2
alert("b jest równe : " + b);
a = false;
b = eval(str); // zwraca 3
alert("b jest równe : " + b);