我正在调试一个大型JavaScript代码库,在某些情况下,当刷新页面时,“console”变量会被清空。
有没有办法在控制台上设置监视器并在该值改变时(或条件(console == null)
为真时)使JavaScript中断执行?
我使用的是Windows 7上的Chrome浏览器。
我正在调试一个大型JavaScript代码库,在某些情况下,当刷新页面时,“console”变量会被清空。
有没有办法在控制台上设置监视器并在该值改变时(或条件(console == null)
为真时)使JavaScript中断执行?
我使用的是Windows 7上的Chrome浏览器。
window.console
无效,因为像其他浏览器本地环境变量一样,console
被特殊处理。任何尝试将值分配给console
的操作都只会“覆盖”原始值,而不是替换它。您无法检测console
值的更改,但您可以使用delete window.console
来恢复原始的环境提供的值。
对于其他值,请使用Object.defineProperty
为某些全局window.foobar
定义一个自定义setter。当分配新值给window.foobar
时,setter函数运行:(function() {
var actualFoobar = window.foobar;
Object.defineProperty(window, "foobar", {
set: function(newValue) {
if(newValue === null) {
alert("someone is clobbering foobar!"); // <-- breakpoint here!
}
// comment out to disallow setting window.foobar
actualFoobar = newValue;
},
get: function() { return actualFoobar; }
});
})();
然后,在该setter函数中设置断点。
这种方法适用于全局变量或任何对象属性(只需将window
更改为具有该属性的对象即可)。
console.trace()
来进行警告、记录或输出日志。 - Elias Van Ootegemconsole.log
时,它仍然会出错。 - Elias Van Ootegemconsole
,而不是 console.log
被覆盖了。感谢您的代码,在通常情况下这是捕获全局变量更改的好方法。神奇的是,在我的情况下它并没有被触发,但是其纯粹的存在(get
方法返回 actualConsole
)解决了问题。 - Janik Zikovsky浏览器中的函数无法设置为空!从技术角度来说。
如果window.console.log
函数被赋值为null
,只需删除它然后恢复原样!
delete console.log
这样就可以完成任务了 :)
编辑:这不是你主要问题的答案,但我认为你的问题来自于你正在寻找一种调试的方法,因此这个答案基本上跳过了检测变量更改的需要。
你不能触碰console
对象... 永远不行。唯一可能发生的事情是在作用域/命名空间中声明了一个console
变量,而不是全局作用域,从而隐藏了全局控制台。但你仍然可以使用window.console
访问它。除此之外,我能想到的唯一可能原因是:
console
的IE版本要找出需要查看代码的位置,设置条件断点并观察一些表达式,使用暂停未捕获的异常按钮
console
会导致其失效。window.console
不能回到原始的控制台。 - Janik Zikovskyconsole
在全局作用域以外的范围被重新定义,那么使用window.console
将起作用。如果window.console
不起作用,那么很有可能delete console;
或者delete window.console
可以解决问题。 - Elias Van Ootegem