5

何が悪いのかわかりません。私は3つのコードを持っています:
最初:

<script language="JavaScript" type="text/javascript">
   var count = 0;
   alert(count);
   var timer = setInterval("count = count + 1; alert(count);",10000);
</script>



2番:

<script language="JavaScript" type="text/javascript">
  function countdown()
  {
   var count = 0;
   alert(count);
   var timer = setInterval("count = count + 1; alert(count);",10000);
  }
  countdown();
</script>



第3:

<script language="JavaScript" type="text/javascript">
   var count = 0;
  function countdown()
  {
   alert(count);
   var timer = setInterval("count = count + 1; alert(count);",10000);
  }
  countdown();
</script>



最初のコードは正常に機能し、2番目のコードは「setInterval」行に「カウントが定義されていません」というエラーを生成し、3番目のコードは再び正常に機能します。「count」変数のスコープは、2番目のコードのsetInterval関数に対してグローバルである必要があります。なぜそうではないのですか?私はMozillaFirefoxを使用しています。ありがとう。

4

1 に答える 1

8

非常に多くの理由で、そのうちの1つに遭遇したばかりですが、またはに文字列を渡すことは決してありません。これまで。私は真剣です。正当な理由はありません。setTimeoutsetInterval

代わりに関数を渡します。関数オブジェクトを渡す機能は、JSの最高の機能の1つです。

var count = 0;
alert(count);

var timer = setInterval(function(){
  count = count + 1;
  alert(count);
}, 10000);

あなたが直面している問題は、このように文字列としてのコードがスコープを尊重しないということです。グローバルスコープで実行されます。これは、2番目と3番目のスニペットに変数が存在しない場所です。そして、最初のスニペットcountは実際にグローバル変数であるため機能します。

これに関する他の問題は、これが基本的evalにそれ自身の頭痛を伴い、完全に避けるのが最善であるという事実から生じます。結局のところ、Evalは悪です。

于 2012-11-10T21:32:09.880 に答える