我想让我的日志记录语句尽可能短,同时防止控制台在不存在时被访问; 我提出了以下解决方案:
var _ = {}; if (console) { _.log = console.debug; } else { _.log = function() { } }
对我来说,这似乎很优雅,它在Firefox 3.6中运行良好(包括保留console.debug
比这更有用的行号console.log
).但它在Safari 4中不起作用.[更新:或在Chrome中.所以问题似乎是Firebug和Webkit控制台之间的区别.]如果我按照上面的说法进行操作
console.debug('A') _.log('B');
第一个语句在两个浏览器中都能正常工作,但第二个语句在Safari中生成"TypeError:Type Error".这只是Firebug和Safari Web开发人员工具如何实现控制台之间的区别吗?如果是这样,Apple的 Webkit 就非常烦人了.将控制台功能绑定到原型然后实例化,而不是直接将其绑定到对象,这没有帮助.
当然,我可以console.debug
从分配给的匿名函数调用_.log
,但后来我丢失了我的行号.还有其他想法吗?
首先,如果console
确实未定义(因为它在IE等浏览器中),您将收到错误.您应该将其检查为全局对象的属性,该属性window
位于浏览器中.一般来说,在使用它之前测试一个功能也是一个好主意,所以我为该debug
方法添加了一个测试.
可能console.debug
Safari中的实现依赖于它this
作为引用的值,console
如果你使用它来调用它将不会是这种情况_.log
(this
将改为引用_
).完成快速测试后,情况确实如此,以下问题解决了这个问题:
var _ = {}; if (typeof window.console != "undefined" && typeof window.console.debug == "function") { _.log = function() { window.console.debug.apply(window.console, arguments); } } else { _.log = function() { } }