2011-05-12 4 views
8

Existe-t-il un moyen de définir une macro similaire aux macros C/C++ en Javascript?définition de macro en javascript

Je veux l'utiliser pour des instructions de débogage: Quelque chose comme

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

Pas nécessairement similaire, mais je veux acheieve cette fonctionnalité. Y a-t-il un moyen de le faire?

Merci

+0

En quoi l'utilisation d'une macro ressemble-t-elle à une simple fonction de programmation en ligne que vous stockez dans une fonction et que vous appelez à volonté? –

+1

est différent car il est évalué au moment de la compilation, pas au moment de l'exécution. – stivlo

+0

Macro récupère automatiquement le __FILE__, __FUNCTION__ (si le compilateur le permet) et __LINE__ automatiquement .. cela rend le code plus clair car nous ne l'encombrons pas avec cette information à chaque appel de fonction – Kiran

Répondre

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

Utilisation:

de&&bug("hello world") 

Lorsque "de" est faux (mode de production), la les frais généraux sont minimes.

+1

C'est très intelligent. Le problème avec les solutions programmatiques est que si la fonction de débogage est lourde, vous devez payer pour calculer et passer les arguments au corps de la fonction, même si la fonction est vide. Cette astuce évite ce problème - dans le code de production, la fonction de débogage n'est jamais appelée. – bearvarine

1

Il n'y a pas moyen de le faire en JavaScript. Vous pouvez avoir une variable globale comme

var isDebugging = false; 

Ensuite, lors de l'écriture du code, vérifiez simplement si la variable est vraie. Évidemment, cela va créer un surcoût indésirable avec la taille du fichier, et une très légère perte de performance. Mais en dehors de la spécification de votre propre format, et de l'exécution du code via un outil pour déconnecter le code de débogage avant de télécharger.

Quelque chose comme

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

Pour une version release, vous devez supprimer tout à l'intérieur des balises, y compris. Et pour une version de débogage, vous pouvez simplement supprimer les balises, mais conserver le code. Quelque chose comme ceci pourrait être exécuté avec un script de construction Ant ou similaire.

0

Javascript n'a pas de macros puisqu'il n'y a pas de compilateur. Vous pouvez utiliser console.log et écrire une expression régulière pour supprimer ces instructions lors du déploiement.

0

Même s'il est vrai qu'il n'y a pas de temps de compilation comme l'indique @sapht, vous pouvez pré-traiter vos fichiers si vous le souhaitez. Typiquement, j'utilise un script ant pour combiner de nombreux fichiers Javascript et ajouter des informations de construction.

A partir d'une recherche google, je vois qu'il ya un préprocesseur Javascript que vous pouvez trouver intéressant: http://www.bramstein.com/projects/preprocess/

0

Pour ceux qui sont encore intéressés:

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

fichier source JavaScript Un préprocesseur en JavaScript pur, par exemple pour construire différentes versions d'une bibliothèque.

Exemples:

// #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

Avec Builder-https://github.com/electricimp/Builder, vous pouvez faire comme:

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

... 

@{MYDEBUG(100500)} 

prend également en charge pour inclut directement à partir de GitHub.

Questions connexes