17

我正在调试一个大型 JavaScript 代码库,其中,在某些时候,刷新页面时“控制台”变量为空。

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

我在 Windows 7 上使用 Chrome。

4

3 回答 3

22

下面的答案不起作用,window.console因为console(像其他浏览器原生环境变量一样)被特殊对待。任何试图将值分配给console仅“掩盖”原始值的尝试;它不会取代它。您无法检测到console值何时更改,但您可以delete window.console恢复原始环境提供的值。

对于其他值,用于Object.defineProperty为一些全局定义自定义设置器window.foobarwindow.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为具有该属性的对象)。

于 2012-11-08T15:20:22.757 回答
0

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

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

delete console.log

这将完成这项工作:)

编辑:这不是您的主要问题的答案,但我认为您的问题来自您寻找调试方法,所以这个答案基本上跳过了检测 var 更改的需要。

于 2012-11-08T15:18:22.240 回答
0

你不能碰那个console物体……永远,永远。唯一可能发生的情况是,console在全局范围之外的范围/命名空间中声明了一个变量,从而隐藏了全局控制台。不过,您仍然可以使用 访问它window.console。除此之外,我能想到的唯一原因是:

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

要找出您需要在代码中查看的位置设置条件断点并观察几个表达式,并使用暂停未捕获异常按钮

于 2012-11-08T15:20:20.327 回答