Jan 30, 2006

JavaScriptでDebugScreen、その2

更新しました。ライブラリ化と適当にドキュメントを書いた。
http://la.ma.la/misc/js/debugscreen/

実際に使ってみたりしながら改良中。プラグイン方式で任意のオブジェクトを表示できるようにしてみました。
関数を登録すると実行結果を返すので複雑なこともできます。サーバーにエラー投げるとかも、まあ、できるけど、本番環境でやるのはおすすめできない。

あとは、強制的にスコープを保存する方法を思いついたのでローカル変数の内容をダンプしたりできるようにしようかな、と、考えている。
var saveVars = "window.__args__ = arguments;(" + function(){
    window.recall = function(expr){
        if(expr == "arguments") return window.__args__;
        return eval("(" + expr + ")");
    }
} + ")()";

function test(){
    eval(saveVars); // 環境保存
    var test = "aiueo";
};
function hoge(){ return test(1,2,3) }
hoge();

alert(recall("test")); // aiueo
alert(recall("arguments")[0]); // 1
alert(recall("arguments").callee) // function test(){ ... }
alert(recall("arguments").callee.caller) // null

evalを使って「evalで任意の変数を取り出すクロージャ」を定義し、環境を無理やり外に引っ張り出しています。関数の呼び出しが終わった後でローカル変数を呼び戻す。適当な語彙が思い浮かばなかったので、とりあえずrecallで。

argumentsを保持してやれば呼び出し元を辿れるかな、と考えていたのだけれど、最後のは上手くいかない。どうやら関数の呼び出しが終わるとFunction#callerプロパティは破棄されてしまうようだ。

IE限定でarguments.caller.calleeだと上手くいったりする。arguments.callerは関数の呼び出し元のargumentsオブジェクトを参照する。Firefoxでは既に廃止されているようだ。

ここら辺はECMA非準拠で環境依存が大きいのだけど、組み込めるようだったら組み込みたい。
Posted at 09:33 | WriteBacks (7) | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.