2011-03-09 70 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,它将运行该函数,但...

无限广告。