2011-03-09 1 views
3

I 구현 한 부분은많은 재귀에 대해이 코드는 무엇을합니까? 이 스크립트의

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

방화범이 나에게 오류가 나에게 코드는 I 있도록 무한 루프처럼 보이는

"오류가 너무 많이 재귀에 휴식"을 제공 디버깅을 도와합니다 원래 저자가 왜 넣었는지 궁금해. 또한 ZFDebugLoad는 값을 가질 수 없으므로 함수에서 반환 값이 없어 ...

EDIT이 오류의 실제 원인은 다음과 같습니다. 동일한 튜토리얼, 오류의 원인 r은 스크립트가 내 HTML5 <header> 태그에 추가 할 수있는 정규식 패턴 /(<head.*>)/i를 사용

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

,이 문제로 인해이 줄을이었고, t는이 문제를 해결 나는 /<head(?!er).*?>/i

답변

2

ZFDebugLoad 이전 저장 패턴에 공백을 삽입 값은 window.onload이며 다른 함수로 바뀝니다.

창에서 load 원래 함수가 있으면 실행하고 ZFDebugCollapsed을 실행합니다.
반환 값이 필요하지 않습니다. JavaScript에서 함수 값입니다. if (ZFDebugLoad)ZFDebugLoadundefined인지 여부, 즉 스크립트를 실행하기 전에 이미 window.onload 함수가 있는지 여부를 확인하십시오. udefined이 아닌 경우 실행될 수 있습니다.

+0

그래서 방화범이 많은 재귀를 말하는 이유는 그것이 bajillion 시간을 실행하려고하는 신호가 아닙니까? – Moak

+0

@Moak - 확인해 보니 정상적으로 작동하는 것 같습니다 : http://jsbin.com/onaye4, 그래서 문제는 다른 곳에서 발생할 가능성이 큽니다. 원래 함수가 무한 재귀를 가질 수 있습니다. 즉,'ZFDebugCollapsed'는 하나를 가지거나 시나리오가 더 복잡합니다 (예를 들어, 전체 코드가'onload'에 바인드 된 함수에 포함되어 있습니다). – Kobi

+0

, 그걸 알아 내야 할 것입니다. 아마도 다른 jQuery 플러그인에 의해 트리거되었을 것입니다. 스크립트를 제외한 모든 스크립트를 비활성화하면 오류가 발생하지 않고 작동하기 때문입니다. – Moak

2

위의 스크립트가 두 번로드되면 무기한 재발행됩니다.

처음으로 스크립트를로드하면 예상대로 작동합니다. 그러나 두 번째로 스크립트를로드하면 window.onload의 원래 값이 손실되고 window.onload 및 ZFDebugLoad 값은 모두 동일한 함수가됩니다.

window.onload는 정의 된 ZFDebugLoad를 검사하기 때문에 실행됩니다.하지만 이제는 동일한 함수이므로 다시 정의 된 ZFDebug를 확인하고 실행합니다. 그러나 ...

무한합니다.