有没有办法可以在Javascript中定义类似于C / C ++宏的宏?
我想将它用于调试语句: 像
这样的东西#ifdef TEST__
#define MYDEBUG(##x) debug(__FILE__,x)
#else
#define debug
#endif
不一定相似,但我想要实现这一功能。我有办法做到吗?
由于
答案 0 :(得分:18)
var de = false; // true when debugging
function bug( msg ){ ... display msg ... }
用法:
de&&bug( "hello world")
当“de”为假(生产模式)时,开销很小。
答案 1 :(得分:1)
在JavaScript中无法做到这一点。你可以有一个像
这样的全局变量var isDebugging = false;
然后在编写代码时,只需检查变量是否为真。显然,这将在文件大小上产生一些不必要的开销,并且性能损失非常小。但除了指定自己的格式之外,还可以通过在上传前删除调试代码的工具来运行代码。
像
这样的东西var foo = function() {
<!-- document.write( "blah" ); -->
};
对于发布版本,您将删除标记内的所有内容,包括。对于调试版本,您可以删除标记,但保留代码。可以使用Ant构建脚本或类似脚本执行此类操作。
答案 2 :(得分:0)
Javascript没有宏,因为没有编译器。您可以使用console.log
并编写正则表达式来部署时删除这些语句。
答案 3 :(得分:0)
虽然@sapht说没有编译时间,但如果需要,可以预处理文件。通常我使用ant脚本将许多Javascript文件组合在一起并添加构建信息。
从谷歌搜索中我发现有一个Javascript预处理器,您可能会感兴趣:http://www.bramstein.com/projects/preprocess/
答案 4 :(得分: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
答案 5 :(得分:0)
使用 Builder - https://github.com/electricimp/Builder,您可以这样做:
@macro MYDEBUG(x)
debug(@{__FILE__}, @{x});
@end
...
@{MYDEBUG(100500)}
还支持直接来自GitHub。