失敗話

デバッグに window.alert(breakpoint) な手段を使いますが、都度都度アラートが出るのがうざいので、console.log が使える環境では console.log を使いたい。なので

function log (str) {
    if (window.console && console.log) {
        console.log(str);
    } else {
        window.alert(str);
    }
}

log('hello world');

は、よくやると思います。

だけども、この log関数が頻繁に出てきた場合、毎回 console.log が使えるかを評価するのは、イケてない気がするので、ロードするときに評価しておけばいいんじゃないかと思うわけです。

this.log = function () {
    return (this.console && console.log) ? console.log : this.alert;
} ();

log('hello world');

と。

ですが、これだと WebKit系だとうまくいかない

Uncaught TypeError: Illegal invocation

"不正な呼び出しやってんだよ、クソが!" と怒られます。console.log を参照呼び出しするといけないみたいです(要出典)

this.log = function () {
    return (this.console && console.log) ? function (str) { console.log(str); } : this.alert;
}();

なら、怒られません。

が、log関数を呼び出すたびに内部で関数を実行するのはナンセンスで、実際問題使えない


コストパフォーマンス改善という観点では失敗なので、違うところで使えないかなと考えています。