2010-10-15 39 views
25

¿Hay alguna manera de que pueda pasar una función como una cadena json (conversión con JSON.stringify), enviarla a otra función, analizar el json y luego ejecutar la función que estaba en el json ? Estoy usando jquery y javascript.pasar la función en json y ejecutar

Respuesta

19

Aquí hay un trabajo example

Básicamente, usted tiene que tener cuidado con este tipo de cosas. Si tomas una función javascript existente, la conviertes en una cadena y la evalúas, es posible que te topes con problemas de redeclaración de funciones. Si simplemente está tomando una cadena función del servidor y desea ejecutarlo, puede hacerlo como lo hice en ese jsFiddle:

Javascript

var myFunc = "function test() {alert('test');}"; 

$(document).ready(function() { 
    var data = new Object(); 
    data.func = myFunc; 
    var jsonVal = $.toJSON(data); 
    var newObj = $.evalJSON(jsonVal); 
    eval(newObj.func); 
    test(); 
});​ 
+0

genial - gracias por este – amateur

-7

No, no puede hacer esto. Las funciones no pueden ser serializadas por JSON. En lugar de convertir el objeto en JSON, puede pasarlo directamente a la otra función sin llamar a JSON.stringify.

+0

Tengo la sensación de que está atravesando un alambre somewheres ... – jcolebrand

+19

JSON = JavaScript Notación de objetos: por supuesto, la función se puede serializar y pasar de un lado a otro. ¿Qué es un objeto? Casi cualquier cosa en JS, funciones incluidas. Ofrézcase un poco molesto cuando alguien diga "No" cuando "SÍ" sea la respuesta correcta. Mejor decir 'no que yo sepa'. Bill –

+0

Pensaría diez veces antes de decir que smt no es posible en JavaScript :) Casi ni siquiera se pueden recordar algunos "NO" en JS per se. "CÓMO" y "POR QUÉ NO" son las preguntas más comunes. –

19

Sí, puede convertir una función en una cadena con su método toString().

Here's an example para mostrar la conversión de una función en una cadena y volver a una función:

var myfunc = function() { 
    alert('It works!'); 
} 

var as_string = myfunc.toString(); 

as_string = as_string.replace('It works', 'It really works'); 

var as_func = eval('(' + as_string + ')'); 

as_func(); 
+0

Este enfoque de programación realmente abre su mente. – zardilior

47

Sí, se puede. Hay muchísimas formas de hacerlo.

Y no hay necesidad de utilizar la función eval "malo" (por favor yahoogle por lo que debe evitarse) como se ha señalado aquí: http://javascript.about.com/library/bleval.htm

var tmpFunc = new Function(codeToRun); 
tmpFunc(); 

Ya fuera JSON en cualquier etapa debería ser irrelevante.

+8

+1 por "yahoogle". Aunque Bing no es más popular que Yahoo en estos días? ¿Sería eso "bingle"? ¿O la frase más larga que Scott Hanselman usó en las presentaciones "Google it on Bing"? – GregL

+0

Estoy de acuerdo @GregL, pero acuñé esta frase hace algún tiempo y ¡simplemente no quiero dejarla pasar! Usar "bingle", "bingoogle" ... simplemente no me suena bien. Además, hay un montón de palabras y proverbios en el idioma inglés que se refieren a cosas obsoletas ... – EasierSaidThanDone

+2

YabingleYabingleGo – Automatico

3

he creado un tenedor de JSONfn que le permite stringify y analizará los objetos y sus prototipos. En mis pruebas básicas funcionó bien.

https://github.com/cgarciae/jsonfn

-2

// Agregar biblioteca jQuery

Soy más

var jsonFun = { 
    fun1 : function(){ 
    alert('Done'); 
    } 
} 

$('button').click(function(){ 
    jsonFun.fun1(); 
}); 

Esto es lo que la mejor manera de pasar función en JSON

Cuestiones relacionadas