2012-09-05 5 views
0

setTimeout 함수에서 계속 참조 오류가 발생합니다.
아래 는의 코드입니다 jade.js 파일에서 자바 스크립트 파일setTimeout 내부에서 함수를 호출 할 때 참조 오류가 발생했습니다.

(function($, undefined) { 

    $(document).ready(init); 

    function init() { 
    registerEventListeners(); 
    } 

    function registerEventListeners() { 
    $('.start_countdown').click(handleStart); 
    $('.end_countdown').click(handleEnd); 
    } 

    var countdown; 
    var countdown_number; 

    function handleStart() { 
    countdown_number = 11; 
    countdown_trigger(countdown_number); 
    } 

    function countdown_trigger() { 
    if (countdown_number > 0) { 
     countdown_number --; 
     document.getElementById('countdown_text').innerHTML = countdown_number; 
     if (countdown_number > 0) { 
      countdown = setTimeout('countdown_trigger()', 1000); 
     } 
    } 
    } 

    function handleEnd() { 
    clearTimeout(countdown); 
    } 

})(jQuery); 

:

extends layout 

append scripts 
    script(src='/javascripts/countDownRedirect.js') 

block content 
    h1= title 

    p Redirecting you to your documents shortly 

    div 
    button.start_countdown#start Start Countdown 
    button.end_countdown#end End Countdown 

    div#countdown_text Placeholding text 

참조 오류 : 'countdown_trigger()'페이지가 모두로드되면

을 정의되지 잘 작동하는 것 같습니다.
시작 버튼을 클릭하면 10이 표시되지만 참조 오류가 발생합니다. 제안 사항이 있으십니까?
감사합니다.

답변

3

setTimeout에서 따옴표를 사용하면 eval을 호출하는 것이 좋지 않습니다. - 당신이 setTimeout()에 문자열을 통과 할 때, 문자열이 글로벌 범위에 eval()에 의해 평가

countdown = setTimeout(countdown_trigger, 1000); 
+0

:

대신 다음과 같이 현재 범위에서 평가하는 실제 함수 참조를 전달합니다. 수업은 배웠다. 감사합니다 – user1460015

1

는 무슨 일이 일어나고 있는지 설명하고 왜 작동하지 않습니다 대신 문자열의 기능에 대한 참조를 전달 시도 . 이는 해당 전역 범위에서 로컬 함수 나 변수를 사용할 수 없음을 의미합니다. countdown_trigger() 함수는 다른 함수 안에 선언되었으므로 전역 범위에 있지 않으므로 eval()에 사용할 수 없으므로 setTimeout()에 전달하면 작동하지 않습니다.

이것은 문자열을 setTimeout()으로 전달하지 않는 많은 이유 중 하나입니다. 한

setTimeout(countdown_trigger, 1000); 
+0

설명 주셔서 감사합니다! – user1460015

관련 문제