2011-03-09 30 views
3

我實現了一部分,以幫助我與調試對於很多遞歸,這段代碼做了什麼?這個腳本的

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

螢火蟲給我的錯誤

我的代碼看起來像一個無限循環,所以我「上的錯誤太多遞歸突破」 「M想知道爲什麼原作者把它在,另外還有在功能上不歸路,所以ZFDebugLoad永遠不會有一個值...

編輯真正原因這個錯誤(對於接下來的任何其他人我做了同樣的教程,導致錯誤r爲這條線

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

它使用正則表達式模式/(<head.*>)/i,這引起了腳本被追加到我的HTML5 <header>標籤,T更正此我插一個空間分成模式/<head(?!er).*?>/i

回答

2

ZFDebugLoad保存舊值window.onload,然後用另一個函數替換它。

在窗口load它首先運行原始函數,如果它有一個,然後運行ZFDebugCollapsed
你不需要返回值。在JavaScript中,函數的值爲if (ZFDebugLoad)檢查ZFDebugLoad是否爲undefined,也就是說,在運行腳本之前是否已經有window.onload函數。如果它不是udefined,它可以執行。

+0

那麼,爲什麼Firebug會說很多遞歸,這不就是它試圖執行bajillion次的標誌嗎? – Moak 2011-03-09 06:11:08

+0

@Moak - 我檢查過了,它似乎工作正常:http://jsbin.com/onaye4,所以問題很可能在其他地方。原始函數可能有無限遞歸,'ZFDebugCollapsed'有一個,或者場景比顯示的更復雜(例如,整個代碼包含在一個綁定到'onload'的函數中) – Kobi 2011-03-09 06:14:42

+0

我看到,那麼我需要弄清楚,它可能是由其他jQuery插件引發的,因爲當我禁用除腳本以外的所有腳本時,它確實可以工作,而不會導致錯誤。 – Moak 2011-03-09 06:23:39

2

如果上面的腳本被加載了兩次,那麼它會無限期地遞歸。

第一次加載腳本時,它的行爲將與預期的相同。 但是,第二次加載腳本時,window.onload的原始值將會丟失,並且window.onload和ZFDebugLoad值都將是相同的函數。由於window.onload現在正在檢查已定義的ZFDebugLoad,它將運行該函數,但現在它是相同的函數,因此它將再次檢查已定義的ZFDebug,它將運行該函數,但...

無限廣告。