1

カラスがいるページがあります。URL はスクリーンショットで確認できますが、無関係です。

Sentry (raven エラーがログに記録されるサービス) では、未定義の関数の呼び出しに関連する数千のエラーが表示され、このブレークポイントに至りました。

ここに画像の説明を入力

スクリーンショットから、変数_oldOnerrorHandlerは未定義です。この時点では、監視されている式_oldOnerrorHandler_oldOnerrorHandler変数の両方が未定義です。したがって、この行if (_oldOnerrorHandler)は決して実行されません。

ここに画像の説明を入力

上記のスクリーンショットは、if ステートメントの内容が実際に実行されていることを示しており、これは_oldOnerrorHandler偽りではないことを意味します。JavaScript でこれがどのように可能であり、このエラーを防ぐためにどのような解決策が考えられますか?

4

2 に答える 2

1

答えは実際には非常に単純です。_oldOnerrorHandler実際には、デバッグしている関数のコンテキストで定義されています。これが、問題の行が実行される理由です。ただし、コンソールで使用されるコンテキストであるウィンドウのコンテキストでは定義されていません。

Raven.js ソース コードを見ると、変数_oldOnerrorHandlerはグローバルに定義されているのではなく、関数内で定義されています。Chrome のコンソールは、デバッグしている関数内でコードを実行するのではなく、グローバルに実行します。つまり、このコードに関する限り、実際には という変数はありません_oldOnerrorHandler。これは、宣言されていない変数を意味することに注意してください。値としてReferenceError宣言された変数は、undefined実際にはコンソールに正常に表示されます。

ウォッチ式が表示される理由がすぐにはわかりません<not available>。ただし、これは<not available>意味undefinedではなく、Chrome がこの式の値を計算できないことを意味することに注意してください。

他のすべてが失敗した場合でも、Raven.js コードをインストルメント化してデバッグに役立てることができます - 行を追加すると、コンソールに出力console.log(typeof _oldOnerrorHandler);されると思います。function

于 2014-07-07T09:34:08.670 に答える