_oldOnerrorHandler未定义; if语句仍然运行

时间:2014-05-21 21:44:10

标签: javascript sentry raven

我有一个乌鸦页面。 URL可以在屏幕截图中看到,但无关紧要。

在Sentry(记录乌鸦错误的服务)中,我看到几千个与调用未定义函数有关的错误,这使我进入了这个断点。

enter image description here

从屏幕截图中,变量_oldOnerrorHandler未定义。此时,_oldOnerrorHandler_oldOnerrorHandler变量的监视表达式都未定义。因此,行if (_oldOnerrorHandler)永远不应该执行。

enter image description here

上面的截图显示if语句的内容确实正在运行,这意味着_oldOnerrorHandler不是假的。 如何在JavaScript中实现这一点,以及有哪些可能的解决方案来防止此错误?

2 个答案:

答案 0 :(得分:1)

答案实际上非常简单:_oldOnerrorHandler实际上是在您正在调试的函数的上下文中定义的 - 这就是有问题的行执行的原因。但是,它不会在窗口的上下文中定义,这是控制台使用的上下文。

如果查看Raven.js源代码,变量_oldOnerrorHandler不是全局定义的,而是定义在函数内部。 Chrome中的控制台不会在您正在调试的函数中运行代码,而是全局运行 - 这意味着就此代码而言,确实没有名为_oldOnerrorHandler的变量。请注意,您获得ReferenceError这意味着一个未声明的变量,一个带有undefined的声明变量作为值实际上会在控制台中显示正常。

我无法立即了解您的观看表达式显示<not available>的原因。但请注意<not available>并不代表undefined - 这意味着Chrome无法计算此表达式的值。

如果其他一切都失败了,您仍然可以使用Raven.js代码来帮助您调试 - 添加console.log(typeof _oldOnerrorHandler);行,我的猜测是它会将function打印到控制台。

答案 1 :(得分:0)

您可以检查变量是否未定义:

if (typeof _oldOnerrorHandler !== 'undefined') {
     // do stuff
}