2011年6月25日土曜日

JavaScriptでのlogデバッグ関数

を見て何となく書いた。

Greasemonkeyだとこういうのをよく書いてて、consoleは直接使わないでlog関数経由で出力してた。

function log(m) {
if (unsafeWindow.console) {
unsafeWindow.console.log.apply(this, arguments);
} else {
console.log.apply(this, arguments);
}
}

わざわざunsafeWindowと分けて書いてるのは、たまにconsoleが無いとか言われることがあったため。

似たような方法で、log関数でデバッグなどをするのは良いけど、公開するときにそのlog関数を除去するのは面倒なので、DEBUGという変数で出力するか否かを変更できるようにしたものも使ってた記憶がある。
var DEBUG = true;// デバッグ関数を切り替え
// DEBUG - true
function log(m) {
if (typeof DEBUG !== 'undefined' && DEBUG) {
if (unsafeWindow.console) {
unsafeWindow.console.log.apply(this, arguments);
} else {
console.log.apply(this, arguments);
}
}
}
これと似たようなもので、上のだと毎回判定しているのが何か気に入らなくてクロージャーで、DEBUGの判定を一回だけにするものも書いた(これはGreasemonkeyじゃなくても使える)
var debug = (function() {
var DEBUG = true;// デバッグ関数を切り替え
if (DEBUG) {
return function() {
console.debug.apply(this, arguments);
};
} else {
// コール可能でできるだけコストが低いものを考える
return function() {
// do not anything
};
}
})();

DEBUG = false;の際はコールしても意味ないダミー関数が呼ばれるようになる。
さっきのと合わせて、GreasemonkeyのunsafeWindowのコードを入れると以下のような感じか

var debug = (function() {
var DEBUG = true;// デバッグ関数を切り替え
if (DEBUG) {
return function() {
log(arguments);
};
} else {
// コール可能でできるだけコストが低いものを考える
return function() {
// do not anything
};
}
function log(m) {
if (unsafeWindow.console) {
unsafeWindow.console.log.apply(this, arguments);
} else {
console.log.apply(this, arguments);
}
}
})();

合わせてこれも

0 コメント:

コメントを投稿