78

我的console.log()JavaScript 中有很多调用。

我应该在部署到生产环境之前将它们注释掉吗?

我想把它们留在那里,这样如果我需要做更多的调试,我就不必费心在以后重新添加评论。这是一个坏主意吗?

4

11 回答 11

119

它将导致 Javascript 错误,终止包含错误的 Javascript 块的执行。

但是,您可以定义一个在 Firebug 不活动时不可用的虚拟函数:

if(typeof console === "undefined") {
    console = { log: function() { } };
}

如果您使用除 之外的任何方法log,则还需要将它们存根。

于 2009-07-11T17:20:48.417 回答
38

正如其他人已经指出的那样,将其保留在某些浏览器中会导致错误,但是可以通过放入一些存根来解决这些错误。

但是,我不仅会注释掉它们,还会直接删除这些行。不这样做似乎很草率。也许我很迂腐,但我认为“生产”代码根本不应该包含“调试”代码,即使是注释形式。如果你留下评论,这些评论应该描述代码在做什么,或者它背后的原因——而不是禁用代码块。(虽然,大多数评论应该被你的缩小过程自动删除。你正在最小化,对吧?)

此外,在使用 JavaScript 的几年中,我不记得曾经回到一个函数并说“天啊,我希望我把这些 console.logs 留在原处!” 一般来说,当我“完成”了一个函数的工作,然后又不得不回到它时,我会回来解决一些其他问题。无论新问题是什么,如果上一轮工作的 console.logs 可能有所帮助,那么我会在第一时间发现问题。换句话说,如果我回到某些事情上,我不太可能需要与以前一样的调试信息。

只是我的两分钱......祝你好运!

于 2009-07-11T17:33:30.983 回答
10

如果您有一个部署脚本,您可以使用它来去除对 console.log 的调用(并缩小文件)。

当您使用它时,您可以通过 JSLint 抛出您的 JS 并记录违规行为以供检查(或阻止部署)。

这是一个很好的例子,说明了为什么要自动化部署。如果您的流程允许您发布其中包含 console.logs 的 js 文件,那么在某些时候您会这样做

于 2009-07-12T16:13:14.257 回答
9

据我所知,没有console.log比以下 45 个字符更短的存根方法:

window.console||(console={log:function(){}});

这是 3 个不同版本中的第一个,具体取决于您要删除的控制台方法,所有这些方法都很小,并且都已在 IE6+ 和现代浏览器中进行了测试。

其他两个版本涵盖了不同的其他控制台方法。一个涵盖四个基础知识,另一个涵盖所有已知的 firebug 和 webkit 控制台方法。再次,以尽可能小的文件大小。

该项目在 github 上:https ://github.com/andyet/ConsoleDummy.js

如果您能想到任何进一步最小化代码的方法,欢迎贡献。

-- 编辑 -- 2012 年 5 月 16 日

我已经改进了这段代码。它仍然很小,但增加了打开和关闭控制台输出的能力:https ://github.com/HenrikJoreteg/andlog

出现在 The Changelog Show 上

于 2011-01-28T23:48:53.613 回答
5

console.log如果对象不存在,您至少应该创建一个虚拟对象,这样您的代码就不会在未安装 firebug 的用户机器上抛出错误。

另一种可能性是仅在“调试模式”下触发日志记录,即如果设置了某个标志:

if(_debug) console.log('foo');
_debug && console.log('foo');
于 2009-07-11T17:18:41.823 回答
5

希望它对某人有所帮助——我不久前为它写了一个包装器,它比公认的解决方案稍微灵活一些。

显然,如果您使用其他方法,例如 console.info 等,您可以复制效果。完成登台环境后,只需将默认 C.debug 更改为 false 即可进行生产,您无需更改任何其他代码/删除行等。稍后很容易返回并进行调试。

var C = {
    // console wrapper
    debug: true, // global debug on|off
    quietDismiss: false, // may want to just drop, or alert instead
    log: function() {
        if (!C.debug) return false;

        if (typeof console == 'object' && typeof console.log != "undefined") {
            console.log.apply(this, arguments); 
        }
        else {
            if (!C.quietDismiss) {
                var result = "";
                for (var i = 0, l = arguments.length; i < l; i++)
                    result += arguments[i] + " ("+typeof arguments[i]+") ";

                alert(result);
            }
        }
    }
}; // end console wrapper.

// example data and object
var foo = "foo", bar = document.getElementById("divImage");
C.log(foo, bar);

// to surpress alerts on IE w/o a console:
C.quietDismiss = true;
C.log("this won't show if no console");

// to disable console completely everywhere:
C.debug = false;
C.log("this won't show ever");
于 2009-07-11T18:43:36.723 回答
4

这似乎对我有用......

if (!window.console) {
    window.console = {
        log: function () {},
        group: function () {},
        error: function () {},
        warn: function () {},
        groupEnd: function () {}
    };
}
于 2009-12-02T21:58:23.903 回答
3

想我会分享一个不同的观点。在 PCI 应用程序中让这种类型的输出对外界可见会使您不合规。

于 2009-07-12T16:16:16.433 回答
2

我同意控制台存根是一个好方法。我尝试了各种控制台插件、代码片段,包括一些相当复杂的。他们都在至少一个浏览器中遇到了一些问题,所以我最终选择了一些简单的东西,如下所示,这是我见过的其他片段和 YUI 团队的一些建议的合并。它似乎可以在 IE8+、Firefox、Chrome 和 Safari(适用于 Windows)中运行。

// To disable logging when posting a production release, just change this to false.
var debugMode = false;

// Support logging to console in all browsers even if the console is disabled. 
var log = function (msg) {
    debugMode && window.console && console.log ? console.log(msg) : null;
};

注意:它支持通过标志禁用日志记录到控制台。也许您也可以通过构建脚本自动执行此操作。或者,您可以公开 UI 或其他一些机制以在运行时翻转此标志。当然,您可以变得更复杂,使用日志记录级别、基于日志阈值的 ajax 提交日志(例如,所有错误级别语句都传输到服务器以存储在那里等)。

许多关于日志记录的线程/问题似乎将日志语句视为调试代码而不是代码检测。因此希望删除日志语句。当应用程序处于野外状态并且附加调试器或从用户或通过支持向您提供信息不再那么容易时,插桩非常有用。你永远不应该记录任何敏感的东西,不管它被记录在哪里,所以隐私/安全不应该受到损害。一旦您将日志记录视为仪器,它现在就变成了生产代码,并且应该按照相同的标准编写。

对于使用越来越复杂的 javascript 的应用程序,我认为检测是至关重要的。

于 2012-06-25T17:42:24.057 回答
1

正如其他人提到的那样,它会在大多数浏览器中引发错误。在 Firefox 4 中它不会抛出错误,消息会记录在 Web 开发人员控制台中(Firefox 4 中的新功能)。

我真正喜欢的此类错误的一种解决方法是de&&bug

var de = true;
var bug = function() { console.log.apply(this, arguments); }

// within code
de&&bug(someObject);
于 2011-01-29T00:41:16.530 回答
0

一个不错的单行:

(!console) ? console.log=function(){} : console.log('Logging is supported.');
于 2010-07-10T08:06:57.110 回答