Chrome JavaScript调试:值更改时如何中断

Chrome JavaScript调试:值更改时如何中断,javascript,debugging,google-chrome,Javascript,Debugging,Google Chrome,我正在调试一个大型JavaScript代码库,在刷新页面时,“console”变量会在某个时刻被置空 有没有一种方法可以在控制台上设置一个监视,并在该值更改时(或者当条件(console==null)为true时)执行JavaScript中断 我正在Windows 7上使用Chrome。浏览器实现的功能不能为空!从技术上讲 如果分配了window.console.log函数null,则只需将其还原并删除即可 delete console.log 这将完成任务:) 编辑:这不是你主要问题的答案,

我正在调试一个大型JavaScript代码库,在刷新页面时,“console”变量会在某个时刻被置空

有没有一种方法可以在控制台上设置一个监视,并在该值更改时(或者当条件
(console==null)
为true时)执行JavaScript中断


我正在Windows 7上使用Chrome。

浏览器实现的功能不能为空!从技术上讲

如果分配了
window.console.log
函数
null
,则只需将其还原并删除即可

delete console.log
这将完成任务:)


编辑:这不是你主要问题的答案,但我认为你的问题来自于你在寻找一种调试方法,因此这个答案基本上不需要检测var变化。

你不能触摸
控制台
对象。。。永远不会。唯一可能发生的事情是
console
变量在作用域/命名空间(而不是全局作用域)中声明,从而隐藏全局控制台。不过,您仍然可以使用
window.console
访问它。除此之外,我能想到的唯一原因是:

  • 您已将控制台覆盖中的用户代理设置为模拟不支持
    console
  • 由于代码中的其他问题,您的代码正在抛出错误
  • 正如@alexandernst指出的:您正在重写console对象的属性。删除您无法访问的方法,就可以了


要找出需要在代码中查找的位置并查看几个表达式,并使用暂停未捕获异常按钮以下答案不适用于
窗口。console
,因为
console
(与其他浏览器本机环境变量一样)是经过特殊处理的。任何将值分配给
控制台的尝试都只能“掩盖”原始值;它不能取代它。您无法检测
控制台
值何时更改,但您可以
删除window.console
以恢复原始环境提供的值

对于其他值,用于为某些全局
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; }
    });

})();
(函数(){
var actualFoobar=window.foobar;
Object.defineProperty(窗口“foobar”{
set:函数(newValue){
如果(newValue==null){

alert(“有人正在敲打foobar!”;//也许使用alert/log/document.write
console.trace()更能提供信息
@EliasVanOotegem这是一个很好的建议;我已经添加了它。我不知道这是否绝对必要,因为OP只是想添加一个断点,但这是一个好主意。我还没有在实际脚本中测试过你的建议,但是当粘贴到浏览器控制台时,它没有任何区别,除非整个console被重新分配。当重新分配
console.log时,它仍然会中断,这是它的意图,不是吗?从OP:
的某一点上,“console”刷新页面时变量被置空。
OP说他想查看
控制台
变量,而不是它的任何成员变量,因此
console.log
应该可以自由置空。我是否误读了这个问题?或者你的意思是我的代码导致
console.log
以某种方式不再为空了?确实是
console
,而不是
console.log
被覆盖。感谢您的代码,这通常是捕获全局变量更改的好方法。奇怪的是,在我的情况下,它不会被触发,而只是它的存在(返回
ActualSolle
get
方法)修复了问题。我发现覆盖
console
会有效地破坏它。
window.console
不会返回到原始控制台。使用
window.console
只有在全局范围以外的范围内重新定义
console
时才会起作用。如果
window.console
不起作用,则是
delete console;
还是
delete window。console
会做这个把戏。这个答案很老,我知道,但毫无意义。试着在开发工具中打开你的控制台:
window.console=null
。游戏结束。类似的问题在这里找到:解决方案在这里:
console
不是一个函数,而是一个函数对象,并且它可以绝对设置为null。