debugモジュールをIE8に対応させる

debugを気に入って使ってるのだけど、IE8で使ってみたらログが出力されなかった。

どうも、debugが標準で持っているログの関数がIE8で出力しないように意図せずなっているようで、それを修正したら出力された。

   return 'object' == typeof console
-    && 'function' == typeof console.log
+    && ('function' == typeof console.log || 'object' == typeof console.log)
     && Function.prototype.apply.call(console.log, console, arguments);

IE8だとtypeof console.logobjectを返すのだけど、functionで比較していたので出力されなかったみたいだ。

ソースコードを修正するのが面倒な場合はモンキーパッチを当てられるので、以下のようにするとdebugのコードをいじらなくて済む。

debug.log = function log() {
  return 'object' == typeof console
    && ('function' == typeof console.log || 'object' == typeof console.log)
    && Function.prototype.apply.call(console.log, console, arguments);
};

ついでに、console.logでなくてconsole.dirにしようと思ったらIE8はconsole.dirを持っていなかった。

あとJSON.stringifyを使ってオブジェクトを文字列で表示しようと思ったのだけど、循環参照があるとダメだった。循環参照を無視するようなコードも書いてみたのだけど、イベントなどを渡すとreplacerの関数がスタックオーバーフローしてダメだった。ちなみに循環参照のObjectをJSON.stringifyするを参考にした。

How do I dump JavaScript vars in IE8?を見かけたので試してみたら、Watchのタブでツリー状に変数の値を見ることができたので、IE8はdebugで頑張るよりもWatchで見た方がいいみたいだ。