2012-09-05 41 views
0

我一直在setTimeout函數內部收到參考錯誤。
下面是在代碼JavaScript文件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); 

在jade.js文件:

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這不是一個好主意。嘗試傳遞一個參考作用,而不是一個字符串:

countdown = setTimeout(countdown_trigger, 1000); 
+0

這做到了。學過的知識。謝謝 – user1460015

1

爲了解釋這是怎麼回事,爲什麼它不工作 - 當你傳遞一個字符串setTimeout(),該字符串由eval()在全球範圍內評估。這意味着在全局範圍內沒有本地函數或變量可用。由於countdown_trigger()函數是在另一個函數中聲明的,因此它不在全局範圍內,因此eval()將不可用,因此在將它傳遞給setTimeout()時它不起作用。

這是決不會將字符串傳遞給setTimeout()的原因之一。

而是傳遞一個真正的函數引用這是在當前的範圍進行評估是這樣的:

setTimeout(countdown_trigger, 1000); 
+0

感謝您的解釋! – user1460015