3

これが私のコードです:

    var showNo = 1;     
    window.setInterval(function() {
          console.log(showNo);
          if(showNo === 1) { var nextNo = 2;  }
          else if(showNo === 2) { var nextNo = 3;  }
          else if(showNo === 3) { var nextNo = 4;  }
          else if(showNo === 4) { var nextNo = 5;  }
          else if(showNo === 5) { var nextNo = 1;  }
          else { var showNo = 1; var nextNo = 2; }

          var showNo = nextNo;
          }, 500);

私の質問は、setInterval ループの開始時に showNo 変数が保持されないのはなぜですか? 上記の例では、コンソールに「未定義」と表示されます。これは簡単な質問かもしれませんが、私は自分自身に質問を教えようとしています.

どんな答えでも素晴らしいでしょう。

ありがとう。

4

5 に答える 5

10

という名前の新しいローカル変数を再作成していますがshowNo、これは という名前のグローバル変数を参照していませんshowNo

グローバル変数を使用するのは非常に悪い習慣です。これを無名関数内にラップすることをお勧めします

これがあなたがやろうとしていることだと思います:

  (function() {
      var showNo = 1;     
      window.setInterval(function() {
            console.log(showNo);

            if( showNo >== 1 && showNo <== 4 ) {  
                showNo++;
            } else if( showNo === 5 ) {
                showNo = 1;  
            } else { 
                showNo = 2; 
            }

            }, 500);
    })();
于 2010-03-14T04:36:39.013 に答える
1

JavaScript の広い世界では、var宣言はブロック スコープではなく関数スコープです。また、関数の最上位に昇格されます。したがって、次のように書いてもかまいません。

var showNo = 1;     
    window.setInterval(function() {
          var showNo; // I'm localizing it
          var showNo; // and again
          var nextNo; // Now I'm declaring a new variable
          var nextNo; // and I just can't stop
          var nextNo; // myself from declaring it again
          var nextNo; // its like beating
          var nextNo; // a
          var nextNo; // dead horse.
          console.log(showNo);
          if(showNo === 1) { nextNo = 2;  }
          else if(showNo === 2) { nextNo = 3;  }
          else if(showNo === 3) { nextNo = 4;  }
          else if(showNo === 4) { nextNo = 5;  }
          else if(showNo === 5) {  nextNo = 1;  }
          else { showNo = 1; nextNo = 2; }

          showNo = nextNo;
          }, 500);

あなたはおそらく今問題を見ることができます。

これをリファクタリングすることに関する他のすべての人のアドバイスも重要です。しかし、JavaScript のスコープを理解すれば、これらの煩わしさはなくなります。

于 2010-03-14T07:50:32.710 に答える
1

@Jacobが言ったことは真実ですが、次のようにコードを少し簡略化することを検討してください。

var showNo = 1;     
window.setInterval(function() {
      console.log(showNo);
      showNo++;
      if(showNo > 4)
          showNo = 1;
      }, 500);
于 2010-03-14T04:47:31.053 に答える
1

Javascript Closuresを読むことをお勧めします。そうすれば、JavaScript で識別子がどのように解決されるかについて深く理解できます。

于 2010-03-14T05:28:49.723 に答える
0

これで値が保持されます。

function hello(){
    var count = 0;
    var timer = setInterval( function(){  count+=1;alert(count); },2000);
}
于 2012-11-13T08:10:35.097 に答える