0

我在 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,但随后会引发引用错误。有什么建议么?
谢谢

4

2 回答 2

3

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

countdown = setTimeout(countdown_trigger, 1000);
于 2012-09-05T02:24:18.237 回答
1

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

这是从不将字符串传递给setTimeout().

而是传递一个真实的函数引用,该引用在您当前的范围内进行评估,如下所示:

setTimeout(countdown_trigger, 1000);
于 2012-09-05T02:33:36.813 回答