2010-03-05 26 views
4

好吧,這聽起來可能有點瘋狂,但聽我說:)Javascript代碼作爲一個變量

我想這樣做在JavaScript如下:

define START_OF_EVERY_FUNCTION = "try {" 
define END_OF_EVERY_FUNCTION = "} catch() {}" 

function TEST() { 
    START_OF_EVERY_FUNCTION 
    // rest of function 
    END_OF_EVERY_FUNCTION 
} 

基本上,我可以定義一個列表的JavaScript行(代碼),幷包括他們如上?我正在尋找一種技術與評論是否這是一個好主意,或者關於在try/catch塊中包裝所有函數的爭論。

我知道eval(),但我不認爲你可以像上面那樣評價語句。

+0

我覺得我得到你正在嘗試做的,這是使用預先編寫的代碼片段來構建新的功能,而我不知道這是一個很好的方法,我認爲最好的方法是使用服務器端語言作爲一種「編譯器」,在JavaScript中使用小模板語言,就像{{snippet1} },然後使用服務器端語言來替換{{snippet1}}的每個實例,例如,使用相應的代碼片段,然後您可以在任何時候重新運行它,並且您擁有您的js cript文件更新 – Rick 2010-09-07 09:00:48

回答

1

這在JavaScript中是不允許的。

+0

是的,顯然 - 但是有沒有一種技術可以實現這一目標? – Jack 2010-03-05 04:15:27

+1

據我所知,沒有。它看起來像你試圖模擬一個宏,我相信宏是用於編譯器語言,而不是解釋。 – 2010-03-05 04:18:06

0

您需要研究面向JavaScript的面向方面的編程。您可以爲函數的輸入和退出創建鉤子。像JSUnit這樣的工具就是這樣做的。

4

這可能是愚蠢的,但你可以通過將其在通過它定義一個主功能和運行等功能。

var execute = function(func){ 
    alert('before'); 
    func(); 
    alert('after'); 
}; 

function sayHi(){ 
    alert('hi there'); 
} 

execute(sayHi); 

按照要求,具有傳遞參數的例子。

var execute = function(func){ 
    alert('before'); 
    var ret = func.apply(null, Array.prototype.slice.call(arguments, 1)); 
    alert('after'); 
}; 

function saySomething(sayWhat){ 
    alert(sayWhat); 
} 

execute(saySomething,'hey there'); 
+0

其實不是一個壞主意! – nickf 2010-03-05 04:19:14

+0

這可能更像是「Javascript方式」。 – 2010-03-05 04:26:32

+0

你能提供一個將參數傳遞給函數的例子嗎? – Asaph 2010-03-05 04:27:19

0

我想你可以用「new Function」操作符來做到這一點。我從來沒有使用過它,因爲我沒有臨牀上的瘋狂,但我相信你可以傳遞一個字符串,它會eval作爲函數體。您也可以撥打myFunction.toString()來獲取每個功能的代碼。所以放在一起,這將會是這樣的:

var functionsToMessUp = ['myFunc1', 'myFunc2']; 

for (var i = 0; i < functionsToMessUp.length; ++i) { 
    var theFunc = window[functionsToMessUp[i]]; // assuming they're in global scope 
    window[functionsToMessUp[i]] = new Function(
     START_OF_EVERY_FUNCTION 
     + theFunc.toString() 
     + END_OF_EVERY_FUNCTION 
    ); 
} 

現在,上面幾乎可以肯定是行不通的 - 有參數和其他的事情要考慮,我甚至不認爲這是怎麼新的函數構造函數的作品,但如果你真的想走這條路(我真的不建議),那麼這可能是一個很好的起點。

+1

+1好的變量名稱:) – alex 2010-03-05 04:27:08

0

也許這樣?

function tryCatch(callback) { 
    try { 
    callback(); 
    } catch() {} 
} 

var myFunction = function() { 
    // do some stuff 
}; 

tryCatch(myFunction); 
1

你可以擴展函數原型:

Function.prototype.tryThis = function() { 
    try { 
     this(); 
    }catch(ex){ 
     alert('Caught '+ex); 
    }; 
}; 

function tryIt() { 
    alert('Inside tryIt');throw "My Error from tryIt"; 
} 

tryIt.tryThis(); 
+0

我也喜歡這個想法。 – Jage 2010-03-11 16:15:31

相關問題