console.log()
我的JavaScript中有很多电话。
在部署到生产环境之前,是否应该将它们注释掉?
我只想把它们留在那儿,所以如果我需要进行更多的调试,那么以后不必再添加注释了。这是一个坏主意吗?
console.log()
我的JavaScript中有很多电话。
在部署到生产环境之前,是否应该将它们注释掉?
我只想把它们留在那儿,所以如果我需要进行更多的调试,那么以后不必再添加注释了。这是一个坏主意吗?
Answers:
它将导致Javascript错误,从而终止包含该错误的Javascript块的执行。
但是,您可以定义一个伪函数,当Firebug处于非活动状态时,该伪函数是无操作的:
if(typeof console === "undefined") {
console = { log: function() { } };
}
如果您使用以外的任何其他方法log
,则也需要将其存根。
正如其他人已经指出的那样,将其保留在某些浏览器中会导致错误,但是可以通过放入一些存根来解决这些错误。
但是,我不仅会注释掉它们,还会直接删除这些行。否则似乎显得草率。也许我正在做书,但是我不认为“生产”代码根本不应该包括“调试”代码,即使是注释形式也是如此。如果您完全不加注释,则这些注释应描述代码的作用或背后的原因-而不是禁用代码块。(尽管,大多数注释应在缩小过程中自动删除。您正在将其最小化,对吧?)
另外,在使用JavaScript的几年中,我不记得曾经回到过一个函数并说“ Gee,我希望我将那些console.log留在这里!” 总的来说,当我“完成”一个函数的工作,而后来又不得不重新使用它时,我会回来解决其他问题。不管新问题是什么,如果上一轮工作的console.logs都可以帮上忙,那么我会在第一时间发现问题。换句话说,如果我回到某件事上,则可能不需要与之前几次完全相同的调试信息。
只是我的两分钱...好运!
据我所知,没有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
希望它能对某人有所帮助-不久前,我为此写了一个包装,它比公认的解决方案稍微灵活一些。
显然,如果您使用其他方法,例如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");
想通了我会有不同的看法。在PCI应用程序中,此类输出对外界不可见,这使您不合规。
我同意控制台存根是一种好方法。我尝试了各种控制台插件,代码片段,包括一些相当复杂的插件。他们都在至少一个浏览器中遇到了一些问题,因此我最终使用了以下类似的简单内容,这是我所见过的其他代码片段以及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的应用程序,我认为检测至关重要。