当前位置:  开发笔记 > 编程语言 > 正文

将console.log分配给另一个对象(Webkit问题)

如何解决《将console.log分配给另一个对象(Webkit问题)》经验,为你挑选了1个好方法。

我想让我的日志记录语句尽可能短,同时防止控制台在不存在时被访问; 我提出了以下解决方案:

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,但后来我丢失了我的行号.还有其他想法吗?



1> Tim Down..:

首先,如果console确实未定义(因为它在IE等浏览器中),您将收到错误.您应该将其检查为全局对象的属性,该属性window位于浏览器中.一般来说,在使用它之前测试一个功能也是一个好主意,所以我为该debug方法添加了一个测试.

可能console.debugSafari中的实现依赖于它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() { }
}


是的,这是传统方法,但它有一个严重的缺陷:它丢失了行号.如果从应用程序的任何位置调用_.log(),控制台将报告该输出是从_.log()函数内生成的,而不是原始源.因此,使用console.debug()而不是console.log()的好处将丢失.
在这种情况下,如果没有任何别名或包装器,坚持使用`console`会不会更容易,如果它不存在,只需用存根方法定义它?例如:`if(typeof window.console!="undefined"){window.console = {debug:function(){}}}`等
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有