2011-05-12 23 views
8

¿Hay alguna manera de que pueda definir una macro similar a las macros C/C++ en Javascript?macro definición en javascript

Quiero usar esto para instrucciones de depuración: Algo así como

#ifdef TEST__ 
#define MYDEBUG(##x) debug(__FILE__,x) 
#else 
#define debug 
#endif 
No

necesariamente similares, pero quiero acheieve esa funcionalidad. ¿Hay alguna manera de que pueda hacer eso?

Gracias

+0

¿De qué manera el uso de algo similar a una macro aquí sería diferente a simplemente usar la lógica de programación en línea que almacena en una función y llamar a voluntad? –

+1

es diferente porque se evalúa en tiempo de compilación, no en tiempo de ejecución. – stivlo

+0

Macro selecciona automáticamente __FILE__, __FUNCTION__ (si el compilador lo permite) y __LINE__ automáticamente ... esto hace que el código se vea más limpio ya que no lo saturamos con esta información con cada llamada de función – Kiran

Respuesta

13
var de = false; // true when debugging 
function bug(msg){ ... display msg ... } 

Uso:

de&&bug("hello world") 

Cuando "de" es falsa (modo de producción), la la sobrecarga es mínima.

+1

Esto es muy inteligente. El problema con las soluciones programáticas es que si la función de depuración es pesada como argumento, debe pagar por la informática y pasar los argumentos al cuerpo de la función, incluso si la función está vacía. Este truco evita ese problema: en el código de producción, nunca se llama a la función de depuración real. – bearvarine

1

no hay una manera de hacer esto en JavaScript. Podría tener una variable global como

var isDebugging = false; 

Luego, al escribir el código, simplemente verifique si la variable es verdadera. Obviamente, esto creará una sobrecarga no deseada con el tamaño del archivo y una pérdida de rendimiento muy leve. Pero aparte de especificar su propio formato, y ejecutar el código a través de una herramienta para quitar el código de depuración antes de cargarlo.

Algo así como

var foo = function() { 
    <!-- document.write("blah"); --> 
}; 

Para una versión de lanzamiento, que le quite todo dentro de las etiquetas, ambos inclusive. Y para una compilación de depuración, puede eliminar las etiquetas, pero conservar el código. Algo como esto podría realizarse con un script de compilación Ant o similar.

0

Javascript no tiene macros porque no hay compilador. Puede usar console.log y escribir una expresión regular para quitar esas declaraciones al implementar.

0

Si bien es cierto que no hay tiempo de compilación como dijo @sapht, puede preprocesar sus archivos si lo desea. Normalmente utilizo un script ant para combinar muchos archivos Javascript y agregar información de compilación.

de una búsqueda en Google veo que hay un preprocesador Javascript que puede resultar interesante: http://www.bramstein.com/projects/preprocess/

0

Para aquellos que todavía están interesados:

https://github.com/dcodeIO/Preprocessor.js

Un archivo JavaScript fuente preprocesador en JavaScript puro, por ejemplo, para construir diferentes versiones de una biblioteca.

Ejemplos:

// #ifdef FULL 
console.log("Including extension"); 
// #include "path/to/extension.js" 
// #else 
console.log("Not including extension"); 
// #endif 

// #if 1==2 
console.log("1==2"); 
// #elif 2==2 
console.log("2==2"); 
// #endif 
0

Con Constructor-https://github.com/electricimp/Builder, se puede hacer como:

@macro MYDEBUG(x) 
    debug(@{__FILE__}, @{x}); 
@end 

... 

@{MYDEBUG(100500)} 

también incluye soportes para directamente desde GitHub.

Cuestiones relacionadas