Jak wykonać skrypt JavaScript będący ciągiem znaków?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
javascript
divinci
źródło
źródło
Możesz to wykonać za pomocą funkcji. Przykład:
źródło
var F=function(){eval(theInstructions);};
?new Function("alert('Hello World');")()
eval
Funkcja oceni ciąg znaków, który jest przekazywany do niego.Ale używanie
eval
może być niebezpieczne , więc używaj go ostrożnie.Edycja: annakata ma dobry punkt - jest nie tylko
eval
niebezpieczna , ale także powolna . Dzieje się tak, ponieważ kod, który ma zostać oceniony, musi zostać przeanalizowany na miejscu, więc zajmie to trochę zasobów obliczeniowych.źródło
eval()
to niebezpieczne. Czy jest jakaś alternatywa?Użyj eval ().
Wycieczka po Eval Schools W3 . Witryna zawiera kilka użytecznych przykładów eval. Dokumentacja Mozilli opisuje to szczegółowo.
Prawdopodobnie otrzymasz wiele ostrzeżeń dotyczących bezpiecznego korzystania z tego. NIE zezwalaj użytkownikom na wstrzykiwanie czegokolwiek do eval (), ponieważ jest to ogromny problem bezpieczeństwa.
Będziesz także chciał wiedzieć, że eval () ma inny zakres .
źródło
eval
lepiej dla mnie niż ten artykuł W3Schools. Coś czytelnego, z dobrym wyjaśnieniem i przykładami, to developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . I nie, nie jestem bjorningeSpróbuj tego:
Osobiście tego nie testowałem, ale wydaje się, że działa.
źródło
Trochę tak, jak powiedział @Hossein Hadżizadeh Alerady, choć bardziej szczegółowo:
Istnieje alternatywa dla
eval()
.Funkcja
setTimeout()
została zaprojektowana do wykonania czegoś po upływie milisekund, a kod, który ma zostać wykonany, jest sformatowany jako łańcuch.To działałoby tak:
1
oznacza, że będzie czekał 1 milisekundę przed wykonaniem ciągu.Może nie jest to najbardziej poprawny sposób, ale działa.
źródło
setTimeout
? Zauważ, że w każdym przypadku sprawi, że wykonanie będzie asynchroniczne. Oznacza to, że cały kod następujący posetTimeout
wywołaniu zostanie wywołany przed kodem przekazanym dosetTimeout
(nawet jeśli zostanie wywołany z wartością 0 (zero)).Myślę, że to najlepszy sposób.
źródło
Użyj eval jak poniżej. Eval należy używać z ostrożnością, proste wyszukiwanie hasła „ eval is evil ” powinno dać kilka wskazówek.
źródło
Sprawdziłem to w wielu skomplikowanych i zaciemnionych skryptach:
źródło
Jeśli chcesz wykonać określone polecenie (czyli ciąg znaków) po określonym czasie - cmd = twój kod - InterVal = opóźnienie uruchomienia
źródło
Val
wInterVal
kapitalizowane?Dla użytkowników, którzy używają węzła i są zaniepokojeni konsekwencjami kontekstowymi
eval()
ofert nodejsvm
. Tworzy maszynę wirtualną V8, która może sandboxować wykonywanie kodu w oddzielnym kontekście.Pójście o krok dalej powoduje
vm2
utrudnienie,vm
pozwalając maszynie wirtualnej na uruchomienie niezaufanego kodu.https://nodejs.org/api/vm.html - Oficjalny plik nodejs / vm
https://github.com/patriksimek/vm2 - Rozszerzony vm2
źródło
Ale może to być niebezpieczne, jeśli pobierasz dane od użytkowników, chociaż przypuszczam, że jeśli wyrządzą im awarię własnej przeglądarki, to ich problem.
źródło
eval
użytkowników, która może na przykład pozwolić użytkownikom na kradzież kont innych użytkowników bez ich wiedzy, po prostu ładując stronę.Nie jestem pewien, czy to oszustwo, czy nie:
źródło
Nowa funkcja i Apply () również działają razem
źródło
eval()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Odpowiadałem na podobne pytanie i wpadłem na kolejny pomysł, jak to osiągnąć bez użycia
eval()
:W powyższym kodzie zasadniczo tworzysz Blob, zawierający twój skrypt, w celu utworzenia adresu URL obiektu (reprezentacja obiektu File lub Blob w pamięci przeglądarki). Ponieważ masz
src
właściwość na<script>
tagu, skrypt zostanie wykonany w taki sam sposób, jakby został załadowany z dowolnego innego adresu URL.źródło
źródło
eval powinien to zrobić.
źródło
Pamiętaj jednak, że eval jest bardzo potężny i dość niebezpieczny. Lepiej mieć pewność, że wykonywany skrypt jest bezpieczny i niezmienny przez użytkowników.
źródło
Można użyć matematyki
Fragment z powyższego linku:
scope
to jakikolwiek przedmiot. Więc jeśli przekażesz zasięg globalny do funkcji evalute, możesz być w stanie wykonać alert () dynamicznie.Również mathjs jest znacznie lepszą opcją niż eval (), ponieważ działa w piaskownicy.
Nowsze wersje mathjs nie używają funkcji eval () ani Function ().
źródło
Używanie zarówno funkcji eval, jak i tworzenia nowej funkcji do wykonywania javascript wiąże się z wieloma zagrożeniami bezpieczeństwa.
Wolę tę metodę, aby wykonać JavaScript, który otrzymuję jako ciąg.
źródło