2010-07-26 13 views
6
var foo = "function(){ alert('meee'); }"; 
foo(); 

He intentado lo anterior pero no funciona ¿hay alguna otra manera de ejecutar esa función sin usar eval?cambiando cadena a una función en javascript (no eval)

thnx

+0

Si puede ser más específico en cuanto a su problema, es probable que haya una alternativa a este enfoque donde no es necesario usar eval. – rfunduk

+0

y '' function() {alert ('mee');} 'es un texto que se ha podido capturar ahora. Necesito llamar a la función ... creo que el ejemplo anterior funciona en php. Es probable que así haya surgido la idea ... así que la función fue tomada de un 'innerhtml'

function(){alert('meee')}
'así que pensé que sería un texto – Val

Respuesta

8

que desea utilizar el constructor Function directamente, como se dijo Anders. Todos los argumentos son cadenas. El último argumento es el cuerpo de la función, los argumentos principales son los nombres de los argumentos que toma la función.

Para tomar prestado de ejemplo de Anders,

var multiply = new Function("x", "y", "return x * y"); 

sería como escribir

var multiply = function (x,y) { 
    return x * y 
} 

En su caso, usted tiene "function(){ alert('meee'); }" y desea guardarlo como una función para var foo.

var fn = "function(){ alert('meee'); }"; 
var foo = new Function("return ("+fn+")")(); 
foo(); 
// alerts "meee" 

La diferencia entre Function y eval es eval carreras en el ámbito privado, mientras que Function carreras en el ámbito global.

var x="haha", y="hehe"; 

function test() { 
    var x=15, y=34; 
    eval("alert('eval: ' + x + ', ' + y)"); 
    new Function("alert('Func: ' + x + ', ' + y)")(); 
} 

test(); 

// eval: 15, 34 
// Func: haha, hehe 

No trate de ejecutarlo en la consola, que obtendrá un resultado engañoso (consolas utilizan eval). Escribirlo en una etiqueta <script> y cargarlo en el navegador dará el resultado verdadero.

+0

, por favor no que la forma en que el constructor' Function' crea esta función sea muy similar a la forma en que 'eval' lo hace. en realidad es solo otra forma de 'eval', por lo que todo lo que realmente hace es evitar usar la palabra' eval' en sí misma. pero también podrías hacer eso como 'ventana [(typeof [] [0]) [3] +" val "] (" 4 + 3 ")', que da '7'. – Claudiu

+0

tengo que reiterar. dices que tienes miedo a la inyección de scripts o que las personas roban tus contraseñas si usas 'eval'. ¡Bueno, ** ESTO ESTÁ USANDO EVAL **! es lo mismo: JS está compilando código arbitrario. ¿Por qué quieres que los usuarios puedan proporcionar sus propias funciones a tu código? – Claudiu

0

no que yo sepa ... es probable que haya una mejor manera de hacer lo que estamos tratando de hacer sin hacer usted vulnerable a un ataque de inyección de scripts que no implica que pasa alrededor de Javascript como cuerda.

+0

Sé :) tengo mucho que buscar sobre esto, pero necesito uno seguro ya que he leído acerca de eval así digamos Tengo la impresión de que también puedes dar nombres de usuario y contraseñas a las personas o borrar todo urself :) – Val

+0

¿realmente depende de dónde viene tu javascript? si está en una base de datos y la única forma en que entran las cadenas de código es mediante un formulario seguro o lo que sea, probablemente estés bien. Por otro lado, si le estás permitiendo a cualquiera ejecutar código arbitrario contra tu backend, probablemente estés buscando problemas. La mayoría de los ataques de javascript que puedo concebir afectarán principalmente a la interacción del usuario, en lugar de a su base de datos. A lo que alude es probablemente una secuencia de comandos que registra las pulsaciones de teclas y las envía a un sitio remoto a través de publicaciones xhr o similares. – vicatcu

+0

de un elemento html innerhtml .. – Val

3

De acuerdo con MDC. Uso:

var multiply = new Function("x", "y", "return x * y"); 
var theAnswer = multiply(7, 6); 
+0

Estoy seguro de que no pedí una clase de matemáticas. todo lo que quiero es hacer una cadena que contenga una función como texto y llamarla. es fácil usar eval, no es seguro y muy lento. – Val

+1

@ Val, es un ejemplo de lo que debería estar usando, lea la página de referencia. – Anders

+0

Sugiero que lo leas nuevamente donde dice propiedades ...'arguments Deprecated' y' arity Deprecated' – Val

Cuestiones relacionadas