0

私は次のようなクロージャーを書いています:

(function(){

   var OutterScope = 1;

   (function RunThisLoop() {

      OutterScope++;
      console.log(OutterScope);

      setInterval(RunThisLoop, 1000);

   })();

})();

<strong>これがjsfiddleです。問題は、コンソール出力がずれているように見えることです。毎秒更新されるはずですが、毎秒 1 秒以上更新されているように見え、最終的にブラウザーがクラッシュします。何故ですか?

4

4 に答える 4

2

RunThisLoop間隔を何度も何度も呼び出して設定することで、リソースが不足している可能性があります...

setTimeoutの代わりに、または のsetInterval外側を移動したい場合がありRunThisLoopます。

于 2012-10-01T01:27:22.477 に答える
2

関数を実行するたびに、スケジュールされたインターバル タイマーを追加します。最終的には雪だるま式になり、すべての CPU リソースを消費します。

これはそれを修正する最良の方法です (setInterval()なしで使用できるシナリオはほとんどありませんclearInterval()):

(function(){

   var OuterScope = 1;
   var myInterval = setInterval(RunThisLoop, 1000);

   function RunThisLoop() {

      OuterScope++;
      console.log(OuterScope);
      //stop clause 
      if (OuterScope > 10) clearInterval(myInterval);    
   };

})();​
于 2012-10-01T01:28:20.593 に答える
1

RunThisLoop()を実行すると、ローカル状態を含むコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
次に、RunThisLoop()を再帰的に呼び出すと、新しいインスタンスのローカル状態の新しいコンテキストが作成されます。
... おっと!スタックオーバーフロー!

于 2012-10-01T01:35:05.643 に答える
0

すでに回答済みです。これは単なる説明です。

を使用しsetIntervalて、新しいループのセットをスケジュールします。ループ内でそれを行うため、指数関数的に増加します。1 秒ごとに、呼び出しの数が 2 倍になります。

  1. 1
  2. 2
  3. 4
  4. 8
  5. 16
  6. 32
  7. 64
  8. 128
  9. 256
  10. 512
  11. 1 024
  12. 2 048
  13. 4 096
  14. 8 192
  15. 16 384
  16. 32 768
  17. 65 536
  18. 131 072
  19. 262 144
  20. 524 288
  21. 1 048 576
  22. 2 097 152
  23. 4 194 304
  24. 8 388 608
  25. 16 777 216
  26. 33 554 432
  27. 67 108 864
  28. 134 217 728
  29. 268 435 456
  30. 536 870 912
  31. 1 073 741 824
  32. 2 147 483 648
于 2012-10-01T02:05:23.367 に答える