【发布时间】:2014-01-18 05:00:54
【问题描述】:
背景
我刚刚了解到,在 DevTools 控制台中调用 keys(window)(或 Object.keys(window))会显示全局范围内的变量(source)。我在 StackOverflow 页面上调用了该代码并得到了以下结果:
变量i 引起了我的注意,因为它似乎错误地位于全局范围内。我尝试查找负责声明i 的代码,但结果很麻烦(代码很多,is 也很多)。
问题
获取控制台警告
已创建全局变量“i” (main.js:342)
可能有用。如何实现该功能?
研究
我认为每当创建新变量时我都需要某种事件。
- 我们在 JavaScript 中确实有 setters。但是,创建 setter 需要您提供属性名称。因为我想监控所有属性,所以我不能真正使用它。
-
__noSuchMethod__(MDN) 会很完美,但它只涵盖方法(并且没有__noSuchProperty__方法)。 -
Object.observe(HTML5 Rocks) 没有透露有关创建该属性的代码的任何信息(console.trace()只给了我观察者函数的名称)。 -
Object.prototype.watch(MDN) - 与 setter 相同,您必须指定属性名称。 - 无论何时创建新的全局变量,调用
Object.preventExtensions(window)(MDN) 都会导致错误并带有良好的堆栈跟踪。此解决方案的问题在于它会干扰脚本执行并可能改变其行为。它也不允许我捕捉错误并正确格式化。
注意事项
- 我知道 jshint/jslint,但我仍然认为在运行时捕获这些声明可能很有用。
- 我不太关心 SO 页面上的
i变量,您可能可以使用 setter 找到声明。我的问题是关于这个问题的一般解决方案。
【问题讨论】:
标签: javascript debugging global-variables google-chrome-devtools