2009-06-02 11 views

Odpowiedz

53

Oceni ciąg, który jest do niego przekazywany.

Ale korzystanie z eval can be dangerous, więc należy zachować ostrożność.

Edit: annakata ma dobry punkt - Nie tylko evalniebezpieczną, to powolny. Dzieje się tak dlatego, że kod, który ma zostać poddany ewaluacji, musi zostać przeanalizowany na miejscu, tak, że zajmie trochę zasobów obliczeniowych.

+24

bardzo niebezpieczne i powolny - należy pogrubienie, kursywa, podkreślenie, a h1 że – annakata

+4

Jestem wątpliwe, że to jakieś wolniejsze niż ładowanie JavaScript nigdzie indziej na stronie, który ma być analizowany jako dobrze. Jeśli jest wolniejszy, dzieje się tak dlatego, że jest wykonywany w innym zakresie, co może zmusić do tworzenia zasobów dla tego zakresu. – cgp

+2

Jeśli powiesz, że 'eval()' jest niebezpieczne. Czy jest jakaś alternatywa? –

15

Użyj eval().

W3 Schools tour of eval. Witryna ma kilka użytecznych przykładów ewaluacji. The Mozilla documentation covers this in detail.

Prawdopodobnie będzie to get a lot of warnings dotyczące bezpiecznego korzystania z tego urządzenia. NIE zezwalaj użytkownikom na wstrzyknięcie ANYTHING do eval(), ponieważ jest to ogromny problem z zabezpieczeniami.

Będziesz także chciał wiedzieć, że eval() ma inną scope.

+10

http://www.w3fools.com/. W3C nie ma nawet nic do powiedzenia na temat eval. Jeśli chcesz zamieścić link do czegoś oficjalnego, cel http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.1 – Bergi

+6

Nie chciałem "linkować do niczego oficjalnego, chciałem linkować do coś czytelnego - Patrząc na to, co * ty * łączysz, nie podaje żadnego wyjaśnienia, jak to jest używane, nie ma przykładów, nie ma sposobu na majsterkowanie i opisuje metodę w izolacji. Dla początkującego jest to całkowicie niewłaściwe połączenie. nie byłoby @bjorninge, czyż nie? – cgp

+1

Specyfikacja opisuje "eval" lepiej dla mnie niż artykuł W3Schools. Coś czytelnego z dobrym wyjaśnieniem i przykładami byłoby https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Reference/Global_Objects/eval. I nie, nie jestem bjorninge – Bergi

1

eval powinien to zrobić.

eval(s); 
2
eval(s); 

Ale może to być niebezpieczne, jeśli pacjent przyjmuje dane od użytkowników, choć przypuszczam, że w razie awarii własnej przeglądarka ów ich problem.

+1

. Eval jest niebezpieczny po stronie serwera. Na kliencie ... nie tak bardzo. Użytkownik może po prostu wpisać javascript: someevilcode na adres przeglądarki i bum. Eval właśnie tutaj. –

+0

@EsbenSkovPedersen Jest to zabronione przynajmniej w chrome i wymaga działania użytkownika, w przeciwieństwie do strony, która zawiera kod "eval" od użytkowników, co może na przykład pozwolić użytkownikom wykraść konta innych użytkowników, nie wiedząc, po prostu ładując stronę. – 1j01

+1

@ 1j01 Szczerze mówiąc, mój komentarz ma pięć lat. –

0
eval(s); 

Pamiętaj jednak, że eval jest bardzo silny i dość niebezpieczne. Lepiej mieć pewność, że skrypt, który wykonujesz, jest bezpieczny i niezmienny przez użytkowników.

+1

W JS wszystko może zostać zmienione przez użytkownika po prostu wpisz "javascript: document.write (" Hello World ");" na prawie dowolny pasek adresu przeglądarki. – UnkwnTech

+1

Tak, ale możesz go utrudnić, nie używając zmiennych globalnych, ukrywając swoje funkcje w zamknięciach itp. Również, unikając ewalu jak ognia =) – PatrikAkerstrand

4

Użyj eval jak poniżej. Eval powinien być używany z rozwagą, proste zapytanie o "eval is evil" powinno rzucić kilka wskazówek.

function ExecuteJavascriptString() 
{ 
    var s = "alert('hello')"; 
    eval(s); 
} 
+1

Dobra wskazówka na to * proste wyszukiwanie o "eval jest złe" * Dzięki! – Taptronic

8

Spróbuj tego:

var script = "<script type=\"text/javascript\"> content </script>"; 
    //using jquery next 
    $('body').append(script);//incorporates and executes inmediatelly 

Osobiście zrobił go przetestować, ale wydaje się działać.

+1

Nie zapomniałeś o zamknięciu> w skrypcie: var script = "

1

Nie wiem, czy jest to oszustwo czy nie:

window.say = function(a) { alert(a); }; 

var a = "say('hello')"; 

var p = /^([^(]*)\('([^']*)'\).*$/;     // ["say('hello')","say","hello"] 

var fn = window[p.exec(a)[1]];      // get function reference by name 

if(typeof(fn) === "function") 
    fn.apply(null, [p.exec(a)[2]]);     // call it with params 
3

sprawdzone to na wielu skomplikowanych i ukrywane skryptów:

var js = "alert('Hello, World!');" // put your JS code here 
var oScript = document.createElement("script"); 
var oScriptText = document.createTextNode(js); 
oScript.appendChild(oScriptText); 
document.body.appendChild(oScript); 
3

Trochę jak co @Hossein Hajizadeh alerady powiedział, choć w sposób bardziej szczegółowy:

Jest to alternatywa dla eval().

Funkcja setTimeout() jest zaprojektowana do wykonywania czegoś po interwale milisekund, a kod do wykonania ma być sformatowany jako ciąg.

To będzie działać tak:

ExecuteJavascriptString(); //Just for running it 
 

 
function ExecuteJavascriptString() 
 
{ 
 
    var s = "alert('hello')"; 
 
    setTimeout(s, 1); 
 
}

1 oznacza, że ​​będzie czekać 1 milisekundę przed wykonaniem ciąg.

Może to nie być najbardziej poprawny sposób, ale działa.

+0

Czy ktoś chce mi wyjaśnić, dlaczego zostałem odrzucony? –

0

Nowa funkcja i apply() razem działa również

var a=new Function('alert(1);') 
a.apply(null) 
0

I odpowiadał podobne pytanie i mam jeszcze inny pomysł jak to osiągnąć bez użycia eval():

const source = "alert('test')"; 
const el = document.createElement("script"); 
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' })); 
document.head.appendChild(el); 

W kodzie powyżej w zasadzie utwórz Blob zawierający skrypt, aby utworzyć URL obiektu (reprezentacja obiektu File lub Blob w pamięci przeglądarki). Ponieważ masz właściwość src na tagu <script>, skrypt zostanie wykonany w taki sam sposób, jak gdyby został załadowany z dowolnego innego adresu URL.

0
function executeScript(source) { 
    var script = document.createElement("script"); 
    script.onload = script.onerror = function(){ this.remove(); }; 
    script.src = "data:text/plain;base64," + btoa(source); 
    document.body.appendChild(script); 
} 

executeScript("alert('Hello, World!');"); 
Powiązane problemy