3

デバッグに役立つように、このスクリプトの一部を実装しました

var ZFDebugLoad = window.onload;
window.onload = function(){
   if (ZFDebugLoad) {
      ZFDebugLoad();
   }
   ZFDebugCollapsed();
};

Firebug で「break on Error too much recursion」というエラーが表示される

私にはコードが無限ループのように見えるので、元の作成者がなぜそれを入れたのか疑問に思っています。また、関数には戻りがないため、ZFDebugLoad には値がありません...

編集このエラーの実際の原因(私が行ったのと同じチュートリアルに従った他の人にとって、エラーの原因はこの行でした

$response->setBody(preg_replace('/(<head.*>)/i', '$1' . $this->_headerOutput(), $response->getBody()));

これは正規表現パターンを使用します/(<head.*>)/i。これにより、スクリプトが HTML5<header>タグに追加されました。これを修正して、パターンにスペースを挿入しました /<head(?!er).*?>/i

4

2 に答える 2

2

ZFDebugLoadの古い値を保存し、window.onloadそれを別の関数に置き換えます。

ウィンドウloadでは、元の関数があればそれを最初に実行し、次に を実行しZFDebugCollapsedます。
戻り値は必要ありません。JavaScript では、関数値です。if (ZFDebugLoad)そうかどうか、ZFDebugLoadつまり、スクリプトを実行する前にundefined既に関数があるかどうかを確認してください。window.onloadそうでない場合はudefined、実行できます。

于 2011-03-09T05:46:15.133 に答える
2

上記のスクリプトが 2 回読み込まれると、無期限に再帰します。

スクリプトを初めてロードすると、期待どおりに動作します。ただし、スクリプトを 2 回目にロードすると、window.onload の元の値が失われ、window.onload と ZFDebugLoad の両方の値が同じ関数になります。

window.onload は現在、定義されている ZFDebugLoad をチェックしているため、それを実行しますが、これは同じ関数であるため、定義されている ZFDebug を再度チェックし、それを実行しますが ...

無限に。

于 2011-03-09T07:02:18.100 に答える