2011-05-12 605 views
8

有没有一种方法可以定义类似于Javascript中的C/C++宏的宏?javascript中的宏定义

我想用这个调试语句: 喜欢的东西

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

不一定相似,但我想acheieve该功能。有没有办法可以做到这一点?

感谢

+0

在这里使用与宏类似的东西的方式与仅仅使用内联编程逻辑的不同之处在于,它们存储在函数中并随意调用? – 2011-05-12 15:54:26

+1

是不同的,因为它是在编译时评估的,而不是在运行时。 – stivlo 2011-05-12 15:58:55

+0

宏自动获取__FILE__,__FUNCTION__(如果编译器允许)和__LINE__自动..这使得代码看起来更干净,因为我们不用这个信息与每个函数调用混淆 – Kiran 2011-05-12 15:59:07

回答

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

用法:

de&&bug("hello world") 

当 “德” 是假的(生产模式)中,开销很小。

+1

这很聪明。程序化解决方案的问题在于,如果调试功能的参数很大,则必须为计算付费并将参数传递给函数体,即使该函数为空。这个技巧避免了这个问题 - 在生产代码中,实际的调试功能从未被调用过。 – bearvarine 2016-08-10 02:13:39

1

没有办法在JavaScript来做到这一点。你可以有一个像

var isDebugging = false; 

然后当编写代码时,只需检查变量是否为真。很显然,这会在文件大小上造成一些不必要的开销,并且会造成很小的性能损失。但除了指定自己的格式,并通过在上传之前剥离调试代码的工具来运行代码之外。

喜欢的东西

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

对于一个发布版本,则可以将标签内取出的一切,包容性。而对于调试版本,您可以删除标签,但保留代码。像这样的东西可以用Ant构建脚本或类似的东西来执行。

0

由于没有编译器,JavaScript没有宏。您可以使用console.log并编写正则表达式来部署时删除这些语句。

0

尽管@sapht表示没有编译时间,但如果需要,可以预先处理文件。通常我使用ant脚本将许多Javascript文件组合在一起并添加构建信息。

从谷歌搜索我看到有一个Javascript预处理程序,你可能会感兴趣:http://www.bramstein.com/projects/preprocess/

0

对于那些谁还有兴趣:

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

在纯JavaScript一个JavaScript源文件预处理,例如构建不同版本的库。

例子:

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