グローバル変数xが定義されているときにFirebugをブレークさせる
-
06-07-2019 - |
質問
非常に大規模なJavaScriptアプリケーションがあり、数か月のコーディングの後に、次のようにvar
キーワードを使用せずに変数が定義されるいくつかのスコープが必然的に発生します。
function() {
x = 5; ...
}
代わりに:
function() {
var x = 5; ...
}
これはどこかで発生しています-どこにあるのかはわかりません-そして、問題の変数名を検索することは困難です。
特定のグローバル変数を最初に作成する行でブレークするようFirebugに依頼する方法はありますか?明確にするために、window.x
がundefined
から定義済みの値に切り替わった瞬間にブレークし、ステートメントをブレークします。
ウォッチ式を作成してみたところ、ブレークポイントに変換できることを期待していましたが、何らかのコンテキストまたはスコープがないとウォッチ式を作成できないようです。
Firebugでこれが不可能な場合、Firefox全般でこれを実現できるものに興味があります。
解決
いくつかのことを提供しました
- 変数の名前を知っています
- グローバルスコープ(関数の外側で宣言)にはその名前の変数はありませんが、関数の内側にのみあります。
- 変数を宣言する関数の呼び出しがあります。
この小さなスクリプトはトリックを実行します:
<script type="text/javascript">
window.__defineSetter__("x", function(value) { console.trace(); });
x = 1;
</script>
その割り当ての前に実行されたコードのトレースを取得します。
状況によっては報告に失敗する場合があるため、 JSLint をご覧ください。すべてのJSファイルをそこにロードして、リントします。
他のヒント
Firefox固有の watch
メソッド。
このJavascriptをHTMLページの最上部の<head>
タグの直後に置きます。
<script>
window.watch('x', function() { debugger });
</script>
window
はすべてのJavascriptオブジェクトで機能します(<=>はグローバルJavascriptオブジェクトです)。
Ionut G. Stanのソリューションを修正して、私が最終的に使用したソリューションを次に示します。
window.__defineSetter__("name", function(value) {
if (value=="div") {
debugger;
}
});
debugger
ではなくconsole.trace()
を使用したため、実行中に停止して確認できました。 <=>を使用すると、この行が何度も実行されるため、膨大なトレースステートメントが表示されます。
漏れのあるスコープはDojoに埋もれていることがわかりました。Dojoはその変数を処理済み要素の名前に設定しています。
SeaMonkeyブラウザーでWebページを表示し(バージョン1.1.16を使用)、エラーコンソールを見ると、宣言されていない変数への割り当てごとにこのタイプのメッセージが表示されます。
Warning: assignment to undeclared variable x
Source File: http://....js
Line: ##
デバッグに加えて、 JSLint でコードを確認することをお勧めします。これは、グローバルスコープでの予期しない割り当てを報告しますエラーとして。
使用できる jslint4java など、jslintのコマンドラインバンドルがいくつかあります。 Antビルドスクリプトのクロスプラットフォーム。