我有一个庞大、困惑的 JS 代码库。有时,在使用应用程序时,变量会设置为 NaN。因为 x = 2 + NaN
导致 x
被设置为 NaN,所以 NaN 会像病毒一样传播。在某个时候,在它传播很远之后,用户会注意到到处都是 NaN,而且狗屎通常不再起作用了。从这种状态开始,我很难回溯并确定 NaN 的来源(很可能有多个来源)。
NaN 错误也不容易重现。尽管有数百人观察并向我报告,但没有人能告诉我导致 NaN 出现的一组步骤。也许这是一种罕见的比赛条件或其他什么。但这绝对是罕见的,而且来源不明。
我该如何修复这个错误?有什么想法吗?
我想到的两个愚蠢的想法,可能不可行:
编写某种预处理器,在每次使用任何变量之前插入
isNaN
检查并记录第一次出现的 NaN。我认为以前没有这样做过,我不知道这会有多难。如有任何建议,我们将不胜感激。在 JS 引擎中运行我的代码,该引擎能够在任何变量设置为 NaN 时设置断点。我不认为开箱即用的任何东西,但将它添加到 Firefox 或 Chrome 有多难?
我觉得我一定不是第一个遇到这种问题的人,但我找不到其他人谈论它。
最佳答案
您的问题可能没有解决方案,又名:中断,只要任何变量设置为 NaN。相反,您可以尝试像这样观察您的变量:
前面已经说过,Chrome 调试器提供了条件断点。但是,它也支持观看表情。在 Watch-Expressions 菜单中,您可以设置中断条件,只要变量设置为特定值。
Object.observe是一种观察对象变化的方法。您可以监听对象的所有更改,并在任何变量设置为 NaN 时调用
debug
。例如,您可以观察窗口对象的所有变化。每当窗口对象上的任何变量设置为 NaN 时,您都会调用debug
。请注意,Object.observe
非常先进,并非所有浏览器都支持(在这种情况下请查看 polyfill)。借此机会为代码中的每个函数编写一个测试用例。执行 random testing并找到可以创建 NaN 值的代码行。
您的另一个问题可能是如何重现此错误。一遍又一遍地重新加载您的网页没有多大意义。您可以查看所谓的 headless 浏览器:它会启动一个浏览器实例而不显示它。它可以用来在网站上执行自动测试,点击一些按钮,做一些事情。也许您可以以最终重现您的错误的方式编写脚本。这样做的好处是您不必重新加载网页数百次。 headless 浏览器有多种实现。 PhantomJS真的很好,在我看来。您还可以使用它启动 Chrome 调试控制台(您需要一些插件:remote debugger)。
此外,请注意 NaN is never equal to NaN .如果你最终能够重现错误,但你的断点不起作用,那将是一个遗憾。
关于javascript - 检测大型 JS 程序中的任何变量何时设置为 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563329/