2011-05-12 602 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