¿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
evalfunción evaluará una cadena que se le pasa.Pero el uso de
evalpuede ser peligroso , así que úselo con precaución.Editar: annakata tiene un buen punto: no solo es
evalpeligroso , 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
evalmejor 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í:
1significa 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 lasetTimeoutllamada 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
ValenInterValmayú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
vm2que endurecevmpermitiendo 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
evales 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
srcpropiedad 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:
scopeEs 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