我想检测 JavaScript 代码以“记录”全局变量的值。例如,我想知道特定变量foo在执行期间的所有值。日志记录不是问题。
实现这一点的最简单方法是什么?我正在考虑使用Rhino(Mozilla 创建的 Java 中的 JavaScript 实现)来生成AST并修改这个 AST。
这可能是您正在寻找的:
http://ejohn.org/blog/javascript-getters-and-setters/
在设置器中放一个日志,就是这样。当然,我不知道这实际上在哪里起作用,如果它必须是受信任的代码,或者任何网页,或者什么。
基于 John Resig 的代码,我将在调试代码中添加如下内容:
var placeLoggerInSetter = function(variableName, obj){ //obj may be window
obj.__defineSetter__(variableName, function(val){
console.log(val); //log whatever here
obj[variableName] = val;
});
}
var something = 0;
placeLoggerInSetter("something", window);
something = 1;
//out goes "1" in the console
something = 2
//out goes "2" in the console
是不是更像?再一次,我没有测试它,这obj[variableName]
条线对我来说看起来很递归......你会在这里告诉它是否有效吗?:)
此外,使用Firebug,
console.dir(obj)
将让您在控制台中查看该对象的所有属性,而不是像使用log()
. 并且还展开属性等等。便利。
如果您不限于 Rhino/Java,Johnson Ruby gem 将 Spidermonkey/Tracemonkey 解释器集成到 Ruby 中。它确实提供了对 AST 的访问。我没有尝试修改 AST;不确定这是否可能(从查看的代码中的名称来看,可能是这样)。
Johnson gem 位于 jbarnette 在 github 上的 Johnson 存储库中。(切换 id 的;Stackoverflow 不希望我在这一点上放置链接......)我最近添加了 tracemonkey 支持,它还没有集成到主源中。它在我(smparkes)在 github 上的 Johnson 存储库中。
Firebug(firefox 插件)具有日志记录功能,您可以将其写入控制台。比使用 alert("foo"); 好多了 为一切
示例日志语句:
console.log("foo="+foo);
有关更多信息,请参阅此帖子(包括更高级的用法)
我不知道通用解决方案或任何存在的东西,但只需将这些变量包装在处理 get/sets 和东西的日志类周围。
您可以使用 Dtrace:
您可以设置调试器;作为文档就绪事件的第一件事,只需逐步完成您的代码。
..弗雷德里克
使用 cvshead 版本的 Rhino,我检测了代码。