¿Cómo ejecuto un JavaScript que es una cadena?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
javascript
divinci
fuente
fuente
Puedes ejecutarlo usando una función. Ejemplo:
fuente
var F=function(){eval(theInstructions);};
?new Function("alert('Hello World');")()
La
eval
función evaluará una cadena que se le pasa.Pero el uso de
eval
puede ser peligroso , así que úselo con precaución.Editar: annakata tiene un buen punto: no solo es
eval
peligroso , es lento . Esto se debe a que el código a evaluar debe analizarse en el acto, por lo que se necesitarán algunos recursos informáticos.fuente
eval()
es peligroso. ¿Hay alguna alternativa?Usa eval ().
Visita a las escuelas W3 de eval . El sitio tiene algunos ejemplos utilizables de eval. La documentación de Mozilla cubre esto en detalle.
Probablemente recibirá muchas advertencias sobre el uso seguro de esto. NO permita que los usuarios inyecten NADA en eval () ya que es un gran problema de seguridad.
También querrá saber que eval () tiene un alcance diferente .
fuente
eval
mejor que ese artículo de W3Schools. Algo legible con una buena explicación y ejemplos sería developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . Y no, no estoy bjorningePrueba esto:
Personalmente, no lo probé pero parece funcionar.
fuente
Un poco como lo que dijo @Hossein Hajizadeh alerady, aunque con más detalle:
Hay una alternativa a
eval()
.La función
setTimeout()
está diseñada para ejecutar algo después de un intervalo de milisegundos, y el código que se ejecutará está formateado como una cadena.Funcionaría así:
1
significa que esperará 1 milisegundo antes de ejecutar la cadena.Puede que no sea la forma más correcta de hacerlo, pero funciona.
fuente
setTimeout
? Tenga en cuenta que en cualquier caso hará que la ejecución sea asíncrona. Significa que todo el código que sigue a lasetTimeout
llamada se invocará antes de que el código pasesetTimeout
(incluso si se llama con 0 (cero)).Creo que esta es la mejor manera.
fuente
Use eval como a continuación. Eval debe usarse con precaución, una simple búsqueda sobre " eval is evil " debería arrojar algunos indicadores.
fuente
Comprueba esto en muchos scripts complejos y ofuscados:
fuente
Si desea ejecutar un comando específico (que es una cadena) después de un tiempo específico - cmd = su código - InterVal = retraso para ejecutar
fuente
Val
enInterVal
mayúscula?Para los usuarios que usan node y que están preocupados por las implicaciones de contexto de las
eval()
ofertas de nodejsvm
. Crea una máquina virtual V8 que puede aislar la ejecución de su código en un contexto separado.Llevar las cosas un paso más allá es lo
vm2
que endurecevm
permitiendo que el vm ejecute código no confiable.https://nodejs.org/api/vm.html - Nodojs / vm oficial
https://github.com/patriksimek/vm2 - Extended vm2
fuente
Pero esto puede ser peligroso si está tomando datos de los usuarios, aunque supongo que si ellos bloquean su propio navegador ese es su problema.
fuente
eval
es el código de los usuarios, lo que podría, por ejemplo, permitir a los usuarios robar las cuentas de otros usuarios sin que lo sepan simplemente cargando la página.No estoy seguro si esto es trampa o no:
fuente
Nueva función y apply () juntos también funcionan
fuente
eval()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Estaba respondiendo una pregunta similar y tuve otra idea de cómo lograr esto sin usar
eval()
:En el código anterior, básicamente crea Blob, que contiene su script, para crear la URL del objeto (representación del objeto File u Blob en la memoria del navegador). Como tiene una
src
propiedad en la<script>
etiqueta, el script se ejecutará de la misma manera que si se cargara desde cualquier otra URL.fuente
fuente
eval debería hacerlo.
fuente
Sin embargo, recuerde que eval es muy poderoso y bastante inseguro. Será mejor que esté seguro de que el script que está ejecutando es seguro e inmutable para los usuarios.
fuente
Uno puede usar mathjs
Fragmento del enlace anterior:
scope
Es cualquier objeto. Entonces, si pasa el alcance global a la función de evaluación, es posible que pueda ejecutar alert () dinámicamente.También mathjs es una opción mucho mejor que eval () porque se ejecuta en un sandbox.
Las versiones más recientes de mathjs no usan eval () o Function ().
fuente
Usar tanto evaluar como crear una nueva Función para ejecutar javascript conlleva muchos riesgos de seguridad.
Prefiero este método para ejecutar el Javascript que recibo como una cadena.
fuente