1

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

在 Sentry(记录 raven 错误的服务)中,我看到数千个与调用未定义函数相关的错误,这些错误将我带到了这个断点。

在此处输入图像描述

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

在此处输入图像描述

从上面的截图可以看出 if 语句的内容确实在运行,也就是说_oldOnerrorHandler不假。这在 JavaScript 中是如何实现的,以及存在哪些可能的解决方案来防止此错误?

4

2 回答 2

1

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

如果您查看 Raven.js 源代码,变量_oldOnerrorHandler不是全局定义的,而是在函数内部定义的。Chrome 中的控制台不会在您正在调试的函数内运行代码,而是在全局范围内运行代码 - 这意味着就这段代码而言,确实没有调用_oldOnerrorHandler. 请注意,您得到ReferenceError这意味着未声明的变量,具有undefinedas 值的已声明变量实际上会在控制台中正常显示。

我无法立即看到您的手表表情为何显示<not available>。但请注意,<not available>这并不意味着undefined- 而是意味着 Chrome 无法计算此表达式的值。

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

于 2014-07-07T09:34:08.670 回答
0

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

if (typeof _oldOnerrorHandler !== 'undefined') {
     // do stuff
}
于 2014-05-21T21:58:50.567 回答