質問

非常に大規模なJavaScriptアプリケーションがあり、数か月のコーディングの後に、次のようにvarキーワードを使用せずに変数が定義されるいくつかのスコープが必然的に発生します。

function() {  
  x = 5; ...  
}

代わりに:

function() {  
  var x = 5; ...  
}

これはどこかで発生しています-どこにあるのかはわかりません-そして、問題の変数名を検索することは困難です。

特定のグローバル変数を最初に作成する行でブレークするようFirebugに依頼する方法はありますか?明確にするために、window.xundefinedから定義済みの値に切り替わった瞬間にブレークし、ステートメントをブレークします。

ウォッチ式を作成してみたところ、ブレークポイントに変換できることを期待していましたが、何らかのコンテキストまたはスコープがないとウォッチ式を作成できないようです。

Firebugでこれが不可能な場合、Firefox全般でこれを実現できるものに興味があります。

役に立ちましたか?

解決

いくつかのことを提供しました

  1. 変数の名前を知っています
  2. グローバルスコープ(関数の外側で宣言)にはその名前の変数はありませんが、関数の内側にのみあります。
  3. 変数を宣言する関数の呼び出しがあります。

この小さなスクリプトはトリックを実行します:

<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ビルドスクリプトのクロスプラットフォーム。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top