我在JavaScript代码中有很多console.log()
调用。
在部署到生产环境之前,我应该注释掉它们吗?
我希望将它们保留在那里,这样如果需要进行任何调试,就不必再添加注释。这是一个坏主意吗?
我在JavaScript代码中有很多console.log()
调用。
在部署到生产环境之前,我应该注释掉它们吗?
我希望将它们保留在那里,这样如果需要进行任何调试,就不必再添加注释。这是一个坏主意吗?
这会导致Javascript错误,终止包含错误的Javascript代码块的执行。
然而,你可以定义一个虚拟函数,当Firebug未启用时它是一个无操作函数:
if(typeof console === "undefined") {
console = { log: function() { } };
}
如果你使用的是log
以外的方法,那么你也需要将这些方法进行存根处理。
console
会变成undefined
,答案是当你“自己”这样做的时候。 - aderchox正如其他人已经指出的那样,保留它将会在某些浏览器中导致错误,但是这些错误可以通过添加一些存根来解决。
然而,我不仅会注释掉它们,而且会直接删除这些行。否则似乎有点马虎。也许我有点迂腐,但我认为“生产”代码根本不应包含任何“调试”代码,即使以注释形式存在也不应该。如果您保留注释,则这些注释应描述代码正在做什么或背后的原因,而不是禁用的代码块。(尽管大多数注释应该由您的缩小过程自动删除。您在进行缩小吗?)
此外,在几年的JavaScript工作中,我无法回忆起曾经回到一个函数并说:“天啊,我希望我在这里留下那些console.logs!”通常情况下,当我完成对函数的工作,并且稍后必须回到该函数时,我是为了解决其他问题而回来的。无论新问题是什么,如果以前一轮工作中的console.logs可能有所帮助,那么我第一次就能发现问题。换句话说,如果我回到某件事上,我不太可能需要与以前完全相同的调试信息。
这只是我的个人意见,祝好运!
我改变了主意,并现在同意多年来累积的评论。
某些日志消息为应用程序提供长期价值,即使是客户端JavaScript应用程序,也应该保留。
其他日志消息是低价值噪音,应该被删除,否则它们将淹没高价值消息。
console.log
:window.console||(console={log:function(){}});
如果对象不存在,您至少应该创建一个虚拟的console.log
,这样您的代码就不会在没有安装firebug的用户机器上抛出错误。
另一种可能性是仅在“调试模式”下触发日志记录,即如果设置了某个标志:
if(_debug) console.log('foo');
_debug && console.log('foo');
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");
这对我来说似乎是有效的...
if (!window.console) {
window.console = {
log: function () {},
group: function () {},
error: function () {},
warn: function () {},
groupEnd: function () {}
};
}
我觉得我可以分享一种不同的看法。在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;
};
正如其他人所提到的,在大多数浏览器中将会抛出错误。在Firefox 4中,它不会抛出错误,消息会被记录在Web开发者控制台中(Firefox 4中新增)。
一个我真的很喜欢的解决此类错误的方法是 de&&bug :
var de = true;
var bug = function() { console.log.apply(this, arguments); }
// within code
de&&bug(someObject);