【发布时间】:2011-03-24 10:57:06
【问题描述】:
有时有些开发者忘记在 javascript 代码中删除 debugger;,这会在 IE 上产生 javascript 错误。
如果存在调试器,如何检查(例如控制台:if(window.console){console.log('foo');})?
顺便说一句:我不想检测浏览器是否是 IE,如果可能的话我想要一个通用的方法 谢谢,
【问题讨论】:
标签: javascript
有时有些开发者忘记在 javascript 代码中删除 debugger;,这会在 IE 上产生 javascript 错误。
如果存在调试器,如何检查(例如控制台:if(window.console){console.log('foo');})?
顺便说一句:我不想检测浏览器是否是 IE,如果可能的话我想要一个通用的方法 谢谢,
【问题讨论】:
标签: javascript
你不能。
最好的解决方案是在您的版本控制系统中添加一个挂钩,以防止包含debugger; 语句的代码被提交/推送。
让您的开发人员搜索 debugger; 或至少在提交之前仔细查看差异也是一种解决方案 - 但不如在 VCS 中硬拒绝有效。
【讨论】:
try ... catch 块?
debugger; 是为了闯入调试器,而不是被抓住。
您可以尝试编译一个将debugger 声明为局部变量的函数。如果debugger被保留为关键字,JS引擎会抛出一个你可以捕捉到的错误。
var debuggerIsKeyword = false;
try {
new Function("var debugger;");
} catch(e) {
debuggerIsKeyword = true;
}
但是我不确定知道关键字是否存在是否真的有用。
【讨论】:
也许最安全的方法是为所有项目创建一个全局包含文件,如果调试器不存在,则将其存根:
if (typeof debugger == 'undefined') {
window.debugger = null;
}
这样对调试器的调用就变成了对 null 的引用。这是无害的。似乎比期望健忘的开发人员将每个调试器调用包装在 if 语句中更好的方法。
同样的方法适用于 console.log 等
编辑:正如 AndrewF 所指出的,调试器实际上是一个关键字,而不是全局的,所以这不起作用。使用下面的代码也可以达到同样的效果,不会报错:
window['debugger'] = null;
【讨论】:
debugger 是一个保留字,因此它“不得用作变量、函数、方法或对象标识符”。这段代码应该会导致解析错误。
由于缺少 IE 没有尝试过,但这应该可以:
if (typeof console !== 'undefined') {
console.log("logging enabled");
}
【讨论】:
if (typeof debugger !== 'undefined') {dowhatever();}