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()評価されます。eval()これは、そのグローバル スコープで使用できるローカル関数または変数がないことを意味します。countdown_trigger()関数は別の関数内で宣言されているため、グローバルスコープ内にないため、使用できず、eval()に渡すと機能しませんsetTimeout()

これは、 に文字列を渡してはいけない多くの理由の 1 つですsetTimeout()

代わりに、次のように現在のスコープで評価される実際の関数参照を渡します。

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