2012-09-01 9 views
16
function derp() { a(); b(); c(); } 

derp.toString() volverá "function derp() { a(); b(); c(); }", pero sólo necesita el cuerpo de la función, por lo "a(); b(); c();", porque entonces puedo calcular la expresión. ¿Es posible hacer esto de forma cruzada?¿Cómo obtener el texto del cuerpo de la función en JavaScript?

+0

'a(); segundo(); c(); 'no es una expresión válida ... –

+0

@FelixKling: ¿Por qué no es válido? –

+3

@ user1600680: ';' separa las instrucciones y, por lo tanto, no puede formar parte de una expresión. Todo lo que arroja un error de sintaxis cuando se lo coloca en el operador de agrupamiento '(...)' no es una expresión válida. Pero tal vez el OP no se refirió a este significado técnico con el término * expresión *. –

Respuesta

30
var entire = derp.toString(); 
var body = entire.slice(entire.indexOf("{") + 1, entire.lastIndexOf("}")); 

console.log(body); // "a(); b(); c();" 

Utilice la búsqueda, esto es duplicado de this question

+2

Use '.slice'. Es lo mismo, pero menos confuso. –

+0

¿Quiere decir 'var body = entire.slice (entire.indexOf (" {") + 1, entire.lastIndexOf ("} "));'? –

+1

Sí, lo hago. 'substring' y' substr' generalmente confunden a las personas. 'slice' es mucho más memorable. –

5

Claro está, ya que desea que el texto entre la primera { y última }:

derp.toString.replace(/^[^{]*{\s*/,'').replace(/\s*}[^}]*$/,''); 

Tenga en cuenta que he roto la sustitución hasta en expresiones regulares en lugar de una expresión regular que cubre todo (.replace(/^[^{]*{\s*([\d\D]*)\s*}[^}]*$/,'$1')) porque requiere menos memoria.

+0

'toString()' en lugar de 'toString' pero esta es la respuesta más limpia que he encontrado, ¡gracias! – kursus

2

se necesita algo como esto:

var content = derp.toString(); 
var body = content.match(/{[\w\W]*}/); 
body = body.slice(1, body.length - 1); 

console.log(body); // a(); b(); c(); 
5

NOTA: La respuesta aceptada depende del intérprete no hacer cosas locas como tirar hacia atrás entre los comentarios 'función' y '{'. IE8 estará feliz de hacer esto:

>>var x = function /* this is a counter-example { */() {return "of the genre"}; 
>>x.toString(); 
"function /* this is a counter-example { */() {return "of the genre"}" 
1

Una sola línea, ejemplo corto de expresiones regulares:

var body = f.toString().match(/^[^{]+\{(.*?)\}$/)[1]; 

Si lo desea, eventualmente, eval el guión, y suponiendo que la función no tiene parámetros, esto debería ser un poco más rápido:

var body = '(' + f.toString() + ')()'; 
Cuestiones relacionadas