2011-01-31 13 views
20

は、我々は(Javascriptのオブジェクトの構成の一部として)このような何かを行うこととします javascriptでバインドされたクロージャ変数を調べる方法は?

var foo = 3; 
this.method = function() { alert(foo); }; 

今すぐ閉鎖 fooが保持されていることを確認し、 methodで使用可能にするために生成されます。現在の閉鎖についてイントロスペクションを行う方法はありますか?

私が探しているのは、利用可能なすべての変数をmethodに列挙する方法で、fooを含める必要があります。このようなデバッグコードは、クロージャのバインディングのデバッグに大きく役立ちますが、まだ見つけていません。これは可能ですか?

答えて

10

言語そのものには、そのような可能性はありません。実際、JavaScriptのクロージャで隠されたデータは、実際には本当にプライベートな(C#、C++、Javaなどの「プライベート」データとは対照的に、ポインタのマジックやリフレクションで常にアクセスできる)数少ないものの1つです。

要するに、これはコンパイラレベルのものです。あなたが望むことができるのは、主要なJavaScriptインタープリタの1つに組み込まれたツールです(または、コアエンジンにそのようなツールを組み込むことができる組み込みの機能)。 Firefox/FirebugまたはV8/Node.jsのいずれかがうまくいくだろうが、私たちは現時点で運が悪いと思う。

7

1.11.2以降、Firebugのコマンドラインには、foothis.method.%fooの値を取得するための構文拡張が含まれています。

DOMパネルの[閉鎖を表示]オプションを有効にし、this.methodという「(クロージャ)」擬似プロパティを展開することで、クロージャ全体を検査することもできます。これはChromeでも動作します(擬似プロパティは<function scope>と呼ばれていますが、そのためのプレフィックスはありません)。

0

JavaScriptはデフォルトでそれを実装していないかもしれませんが、グローバルオブジェクト(fooはそのプロパティです)からすべてのプロパティを読み取ってクロージャに到達するまですべてのプロパティを読み取る方法を想像することができます。私はjavascriptについてあまり知らないと言っていますが、たぶん私はnoncencesを言っているだけかもしれませんが、おそらくあなたは私のアプローチから新しいアイデアを得るでしょう。

+1

'foo'がローカル変数である場合(多分OPの例はすべてコンストラクタ内にあります)、グローバルオブジェクトからは到達できません。 – dpercy

関連する問題