グローバル変数の値を「ログ」するために、JavaScript コードを計測したいと考えています。たとえば、特定の変数fooが実行中に持っていたすべての値を知りたいとします。ロギングは問題ではありません。
これを実装する最も簡単な方法は何でしょうか? Rhino (Mozilla によって作成された Java での JavaScript 実装) を使用して AST を生成し、このASTを変更することを考えていました。
Rhino / Javaに制限されていない場合、JohnsonRubygemはSpidermonkey/TracemonkeyインタープリターをRubyに統合します。ASTへのアクセスを提供します。私はASTを変更しようとはしていません。それが可能かどうかはわかりません(見たコードの名前から判断すると、可能かもしれません)。
Johnsonの宝石は、githubのjbarnetteのJohnsonリポジトリにあります。(スイッチID; Stackoverflowは、この時点でリンクを挿入することを望んでいません...)最近tracemonkeyサポートを追加しましたが、まだマスターソースに統合されていません。githubにある私の(smparkes)のJohnsonリポジトリにあります。
これはあなたが探しているものかもしれません:
http://ejohn.org/blog/javascript-getters-and-setter/
ログをセッターに入れれば、それだけです。もちろん、これが実際にどこで機能するのか、信頼できるコードである必要があるのか、それとも Web ページなのか、あるいは何なのかはわかりません。
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 の cvshead バージョンを使用して、コードを計測しました。
デバッガーを設定できます。ドキュメント準備完了イベントの最初のこととして、コードを段階的に実行するだけです。
..フレドリック
Dtrace を使用できます。
Firebug (firefox のプラグイン) にはログ機能があり、コンソールに書き込むことができます。alert("foo"); を使用するよりもはるかに優れています。全てにおいて
ログ ステートメントの例:
console.log("foo="+foo);
詳細については、この投稿を参照してください (より高度な使用法を含む)