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

Ho provato quanto sopra ma non funziona c'è un altro modo per eseguire quella funzione senza utilizzare eval?cambio di una stringa in una funzione in javascript (non eval)

thnx

+0

Se puoi essere più specifico riguardo al tuo problema, probabilmente c'è un'alternativa a questo approccio in cui non hai bisogno di usare eval. – rfunduk

+0

beh la funzione function() {alert ('mee');} 'è un testo che è riuscito a catturare ora ho bisogno di chiamare la funzione ... penso che l'esempio sopra funzioni su php thats probabilmente come ho avuto l'idea ... quindi la funzione è stata presa da un '

function(){alert('meee')}
' innerhtml quindi avrei pensato che sarebbe stato un testo – Val

risposta

8

si desidera utilizzare direttamente il costruttore Function, come ha detto Anders. Tutti gli argomenti sono stringhe. L'ultimo argomento è il corpo della funzione, tutti gli argomenti principali sono i nomi degli argomenti che la funzione assume.

Per prendere in prestito dall'esempio di Anders',

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

sarebbe come scrivere

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

Nel tuo caso, hai "function(){ alert('meee'); }" e si desidera salvarlo come una funzione per var foo.

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

La differenza tra Function e eval è eval viene eseguito in l'ambito privato, mentre Function viene eseguito in ambito globale.

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 

Non cercare di eseguirlo nella console, si otterrà un risultato ingannevole (console utilizzano eval). Scriverlo in un tag <script> e caricarlo nel browser darà il risultato vero.

+0

per favore non che il modo in cui il costruttore' Function' crea questa funzione sia lo stesso di il modo in cui "eval" fa. in realtà è solo un'altra forma di "eval", quindi tutto ciò che realmente fa è evitare di usare la parola "eval" stessa. ma si potrebbe anche farlo come 'window [(typeof [] [0]) [3] +" val "] (" 4 + 3 ")', che dà '7'. – Claudiu

+0

devo reiterare. dici di avere paura dell'iniezione di script o di persone che rubano le tue password se usi 'eval'. bene, ** QUESTO UTILIZZA EVAL ** !!! è la stessa cosa: il codice arbitrario viene compilato da JS ed eseguito. perché vuoi che gli utenti siano in grado di fornire le proprie funzioni al tuo codice? – Claudiu

0

Non che io sappia ... probabilmente c'è un modo migliore per fare ciò che si sta cercando di fare senza farsi vulnerabili ad un attacco di inserimento di script che non comporta passando intorno JavaScript come stringa.

+0

Lo so :) ho molta ricerca su questo, ma ho bisogno di uno sicuro come ho letto su eval bene lascia solo dire Ho l'impressione che potresti anche dare nomi utente e password alle persone o cancellare tutto da solo :) – Val

+0

dipende davvero da dove proviene il tuo javascript? se si trova in un database e l'unico modo in cui le stringhe di codice entrano è in una forma sicura o cosa hai, probabilmente stai bene. D'altra parte, se stai lasciando che chiunque metta codice arbitrario da eseguire contro il tuo back-end, probabilmente stai chiedendo dei problemi. La maggior parte degli attacchi javascript che posso immaginare influenzano maggiormente l'interazione dell'utente, piuttosto che il database. Quello a cui stai alludendo è probabilmente uno script che registra le sequenze di tasti e li invia a un sito remoto tramite post xhr o simili. – vicatcu

+0

da un elemento html innerhtml .. – Val

3

Secondo MDC. Usa:

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

Sono sicuro di non aver chiesto una lezione di matematica. tutto ciò che voglio è creare una stringa che contenga una funzione come testo e chiamarla. è facile usare eval, non è sicuro e molto lento. – Val

+1

@Val, è un esempio di cosa dovresti usare, leggi la pagina di riferimento. – Anders

+0

Ti suggerisco di leggerlo di nuovo dove dice proprietà ...'arguments Deprecated' e' arity Deprecated' – Val

Problemi correlati