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

时间:2012-11-08 15:14:22

标签: javascript debugging google-chrome

我正在调试一个大的JavaScript代码库,在某些时候,刷新页面时“console”变量会变为空。

有没有办法在控制台上设置监视并在该值发生变化时(或条件(console == null)为真时)执行JavaScript中断?

我在Windows 7上使用Chrome。

3 个答案:

答案 0 :(得分:19)

以下答案不适用于window.console,因为console(与其他浏览器原生环境变量一样)是专门处理的。任何将值分配给console的尝试只会“掩盖”原始值;它不会取代它。您无法检测console值何时更改,但您可以delete window.console恢复原始环境提供的值。

对于其他值,请使用Object.defineProperty为某些全局window.foobar定义自定义设置器。只要为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更改为具有该属性的对象)。

答案 1 :(得分:0)

浏览器实现的功能无法归零!从技术上讲。

如果window.console.log funcion已分配null,则只需将其恢复即可将其删除!

delete console.log

那将完成这项工作:)

编辑:这不是你的主要问题的答案,但我认为你的问题是从你搜索调试的方式,所以这个答案基本上跳过了检测var变化的需要。

答案 2 :(得分:0)

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

  • 您已在控制台覆盖中设置用户代理,以模拟不支持console的IE版本
  • 由于您的代码存在其他问题,您的代码会出错:
  • 正如@alexandernst指出的那样:你正在覆盖控制台对象的属性。删除你无法访问的方法,你很好

要找出您需要查看代码set conditional breakpoints的位置并观看几个表达式,使用暂停未捕获的异常按钮