我有一个乌鸦页面。 URL可以在屏幕截图中看到,但无关紧要。
在Sentry(记录乌鸦错误的服务)中,我看到几千个与调用未定义函数有关的错误,这使我进入了这个断点。
从屏幕截图中,变量_oldOnerrorHandler
未定义。此时,_oldOnerrorHandler
和_oldOnerrorHandler
变量的监视表达式都未定义。因此,行if (_oldOnerrorHandler)
永远不应该执行。
上面的截图显示if语句的内容确实正在运行,这意味着_oldOnerrorHandler
不是假的。 如何在JavaScript中实现这一点,以及有哪些可能的解决方案来防止此错误?
答案 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
}