すべての関数呼び出しをグローバルにインターセプトしてログを挿入する優れた方法は思いつきません (ただし、以下の更新セクションに適切な回避策があります)。
代わりに、関心のある特定の名前空間内の関数にのみログを追加するのはどうですか? これは、次のセットアップ コードで実行できます。
var functionLogger = {};
functionLogger.log = true;//Set this to false to disable logging
/**
* Gets a function that when called will log information about itself if logging is turned on.
*
* @param func The function to add logging to.
* @param name The name of the function.
*
* @return A function that will perform logging and then call the function.
*/
functionLogger.getLoggableFunction = function(func, name) {
return function() {
if (functionLogger.log) {
var logText = name + '(';
for (var i = 0; i < arguments.length; i++) {
if (i > 0) {
logText += ', ';
}
logText += arguments[i];
}
logText += ');';
console.log(logText);
}
return func.apply(this, arguments);
}
};
/**
* After this is called, all direct children of the provided namespace object that are
* functions will log their name as well as the values of the parameters passed in.
*
* @param namespaceObject The object whose child functions you'd like to add logging to.
*/
functionLogger.addLoggingToNamespace = function(namespaceObject){
for(var name in namespaceObject){
var potentialFunction = namespaceObject[name];
if(Object.prototype.toString.call(potentialFunction) === '[object Function]'){
namespaceObject[name] = functionLogger.getLoggableFunction(potentialFunction, name);
}
}
};
次に、ロギングを追加したい名前空間オブジェクトに対して、次のように呼び出します。
functionLogger.addLoggingToNamespace(yourNamespaceObject);
これが実際に動作していることを確認するためのフィドルです。
UPDATEを呼び出して、呼び出し時にすべてのグローバル関数にロギングを追加
できることに注意してください。functionLogger.addLoggingToNamespace(window);
また、本当に必要な場合は、ツリーを走査して関数を見つけ、それに応じて更新することもできます。この方法の欠点の 1 つは、その時点で存在する関数に対してのみ機能することです。したがって、これはまだ最善の解決策ではありませんが、手動でログ ステートメントを追加するよりもはるかに少ない作業です :)