console.log()
我的JavaScript中有很多调用.
在部署到生产之前,我应该对它们进行评论吗?
我想把它们留在那里,所以如果我需要做更多的调试,我不必在以后重新添加注释的麻烦.这是一个坏主意吗?
它将导致Javascript错误,终止包含错误的Javascript块的执行.
但是,您可以定义一个虚拟函数,当Firebug未激活时,它是一个无操作:
if(typeof console === "undefined") { console = { log: function() { } }; }
如果你使用除了之外的任何方法log
,你也需要删除它们.
正如其他人已经指出的那样,留下它会导致某些浏览器出错,但这些错误可以通过放入一些存根来解决.
但是,我不仅会对它们进行评论,而是直接删除这些行.这样做似乎很草率.也许我是迂腐的,但我不认为"生产"代码应该包括"调试"代码,即使是在评论的形式.如果你完全留下评论,那些评论应该描述代码正在做什么,或者背后的原因 - 不是禁用代码块.(虽然,大多数评论都应该由你的缩小过程自动删除.你正在最小化,对吧?)
此外,在使用JavaScript的几年中,我不记得曾经回到函数并说"哎呀,我希望我在这里留下那些console.logs!" 一般来说,当我"完成"一个函数,然后必须回到它,我回来修复一些其他问题.无论新问题是什么,如果上一轮工作中的console.logs可能有所帮助,那么我第一次就发现了这个问题.换句话说,如果我回过头来看,我可能不需要在以前的场合使用完全相同的调试信息.
我的两分钱......祝你好运!
如果您有部署脚本,则可以使用它来去除对console.log的调用(并缩小文件).
在您使用它时,您可以通过JSLint抛出JS并记录违规以进行检查(或阻止部署).
这是您希望自动部署的一个很好的示例.如果您的进程允许您在其中发布带有console.logs的js文件,那么您将在某个时刻执行此操作.
据我所知,没有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上有特色
console.log
如果对象不存在,您至少应该创建一个虚拟对象,这样您的代码就不会在没有安装firebug的情况下在用户的机器上抛出错误.
另一种可能性是仅在"调试模式"下触发日志记录,即如果设置了某个标志:
if(_debug) console.log('foo'); _debug && console.log('foo');
希望它有所帮助 - 我曾经为它写了一个包装器,它比公认的解决方案稍微灵活一些.
显然,如果你使用其他方法,如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");