現在のスコープの周囲のjsコードをテキストとして取得しようとしています。後でライブエディタに組み込むことを意図しています。それは可能ですか?最悪の場合、Rhinoを通過できます。周囲のJSクロージャコードをテキストとして取得する
どうもありがとう
現在のスコープの周囲のjsコードをテキストとして取得しようとしています。後でライブエディタに組み込むことを意図しています。それは可能ですか?最悪の場合、Rhinoを通過できます。周囲のJSクロージャコードをテキストとして取得する
どうもありがとう
一般的に、 JavaScriptは、変数定義や呼び出しスタックのイントロスペクションに信頼できる方法を提供しません。あなたはそれを歩いて、ソースコードを抽出することができるように
arguments.callee
とarguments.caller
は、限り何の再帰呼び出しが存在しないとして、コールスタック上の関数のセットにイントロスペクションを提供します。しかし、それは
f
が呼び出される
function defeatArgumentsCaller(f, args, called) {
if (!called) { return defeatArgumentsCaller(f, args, true); }
return f.apply(args);
}
function f() {
defeatArgumentsCaller(g, []);
}
で敗北することができ、g
は、それがarguments.caller
を見て、f
で呼ばれたことを判断することはできません。
function g() {
var fn = arguments.callee;
while (true) {
alert(fn.name);
var caller = fn.caller;
// defaultArgumentsCaller is itself, not f.
if (!caller || caller == fn) { break; }
fn = caller;
}
}
これらは、定義されたシンボルのセットに対してイントロスペクションを許可しません。 with
またはcatch
を介して導入されたものので、コールスタックと機能のソースコードを調べることによって
function f(o) {
try {
throw null;
} catch (e) {
with (o) {
...
}
}
}
に...
で利用可能なローカル変数を列挙しようとすると、いくつかの定義されたシンボルを欠場します。
コールスタックは、クロージャのスタックとも異なります。例えば、counter
以来示唆しているコールスタックより利用できるより多くのシンボルを持っている状況で
function counter() {
var n;
return function (f) { return f(n++); };
}
counter()(eval);
eval
実行で呼び出された時点eval
にコールスタック上ではありません。
Rhinoは、現在のスタックフレームに名前を列挙するために使用することができ、あなたがgetPrototype
を経由して高いスタックフレームまで歩くことができるgetIds
方法を公開しScriptable
として現在のスコープへのアクセスを可能にします。
これを確認する必要があります。アンパサンドは言った、それは全文を与えます。それがなければ、私はRhinoの方法をチェックします。あなたもありがとう。 – xamiro
@ mc007、あなたは100%のソリューションは必要ないかもしれませんが、そのソリューションは再帰的な外部関数のために失敗します。 –
+1。大きな説明と例。私が書いたり読んだコードの85%については、 'arguments.callee'と' arguments.caller'が動作します。 – ampersand