0

タイマーを作ろうとしています。2 つの状況を比較してください (最初の状況は機能しますが、2 番目の状況は機能しません)。

何が問題ですか?

4

2 に答える 2

5

これは、jsFiddle の「JavaScript セクション」のユーザーがよく遭遇する問題です。ご覧のとおり、「JavaScript セクション」に配置されたコードは、ハンドラーとして使用される関数内にラップされているloadため、2 番目の例では、実際の出力結果は次のようになります。

  <script type='text/javascript'>
  //<![CDATA[ 
  $(window).load(function(){
  var seconds = 0;

function timedCount() {
    $("#txt").val(seconds);
    seconds += 1;
    setTimeout("timedCount()",1000);
}
  });
  //]]> 
  </script>

これは、ハンドラーtimedCountのスコープでのみ使用できるため、もはやグローバル関数ではありません。コードの文字列で使用すると、グローバル スコープから評価されます。loadsetTimeout

これを修正する方法は次のとおりです。

setTimeoutへの呼び出しを変更しますsetTimeout(timedCount, 1000);

これが行うことは、実際の関数オブジェクトを に渡すことsetTimeoutです。毎回グローバルスコープからコードの文字列を評価するのではなく、スコープがもはや問題にならないため、これは本質的に関数を呼び出す機能を保持します-関数をに渡しますsetTimeout

  var seconds = 0;

function timedCount() {
    $("#txt").val(seconds);
    seconds += 1;
    setTimeout(timedCount,1000);
}

timedCount使用してグローバル関数を作成しますtimedCount = function() { ... };

これは単にtimedCountグローバルを作成するだけなので、グローバル スコープからsetTimeout評価しようとすると、グローバル スコープに関数timedCount();があるため成功します。timedCount

  var seconds = 0;

timedCount = function() {
    $("#txt").val(seconds);
    seconds += 1;
    setTimeout("timedCount();",1000);
}
于 2011-07-30T03:49:23.367 に答える
2

timedCount2 つ目は関数を jQuery関数でラップするreadyため、グローバル スコープでは使用できません。

修正済み: http://jsfiddle.net/x7xhA/2/

于 2011-07-30T03:48:17.240 に答える