我想知道您對我製作的函數的看法,它包裝對象的每個方法,添加「try catch」處理程序以在服務器端記錄JavaScript錯誤。關於在JavaScript中使用「try catch」封裝每個方法的性能問題
我不想使用window.onerror
,因爲這個security restriction,我的腳本將託管在CDN上的不同域上。
/*
* object: Object to be wrapped
* errorHandler: Instance of ErrorHandler Object
*/
function addLog(object, errorHandler) {
var name, method;
for (name in object) {
method = object[name];
if (typeof method === "function") {
object[name] = function(method, name) {
return function() {
try {
return method.apply(this, arguments);
} catch (ex) {
ex.message += "; method: '" + name + "'";
errorHandler.addToStack(ex.message);
throw ex;
}
};
}(method, name);
}
}
return object;
}
errorHandler.addToStack
是異步發送錯誤報告給使用Ajax消息的服務器的自定義對象的方法。
我想包裝實例對我有此功能的應用程序中的每個對象,但我不知道:
- 這是一個不好的做法?
- 它有性能問題嗎?
- 有沒有更好的方法來做到這一點?
在此先感謝!
我有點困惑(並且好奇):在這個測試中,你的「封閉嘗試」在什麼意義上涉及try/** catch **? AFAICT它不會做任何這樣的事情... – delicateLatticeworkFever
對不起@goldilocks,我忘了添加它!我剛剛解決了這個問題,並且它拋出了類似的結果。仍然沒有太大的區別。只有我不明白的是,爲什麼在Chrome中它運行得更快,關閉和try catch聲明!?!?!?! –
有趣的鉻和良好的性能測試(我是+1),但爲什麼你在測試2中使用自動執行功能(nb,「閉包」是一個更一般的概念)?我在其中添加了「修訂2」,其中「簡單嘗試」實際上「不嘗試」和「簡單嘗試」幾乎相同。也就是說,「關閉嘗試」和「不嘗試」之間的區別似乎與try/catch無關;)http:// jsperf。com/try-catch-performance-closure/2 *當你測試某個東西時,只需測試它,而不是它+其他不相關的東西。* – delicateLatticeworkFever