在setTimeout中调用函数时引用错误

时间:2012-09-05 02:17:29

标签: javascript jquery

我在setTimeout函数中不断收到引用错误 以下是javascript文件中的代码

( 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但随后抛出引用错误。 有什么建议吗? 感谢

2 个答案:

答案 0 :(得分:3)

当您在setTimeout中使用引号时,您正在调用eval,这不是一个好主意。尝试传递对函数的引用而不是字符串:

countdown = setTimeout(countdown_trigger, 1000);

答案 1 :(得分:1)

要解释发生了什么以及为什么它不起作用 - 当您将字符串传递给setTimeout()时,字符串将在全局范围内由eval()进行评估。这意味着该全局范围内没有可用的本地函数或变量。由于您的countdown_trigger()函数是在另一个函数中声明的,因此它不在全局范围内,因此eval()不可用,因此当您将它传递给{{1}时它不起作用}。

这是永远不会将字符串传递给setTimeout()的众多原因之一。

而是传递一个真实的函数引用,在当前作用域中进行评估,如下所示:

setTimeout()