Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

タイマーやコールバックを忘れると、JavaScriptでメモリリークが発生する可能性がありますか?


忘れられたタイマー/コールバック

javascriptには、setTimeout()とsetInterval()という2つのタイミングイベントがあります。前者は指定されたミリ秒数待機した後に関数を実行しますが、後者は定期的に関数を実行します(一定の時間間隔ごとに繰り返されます)。

オブジェクトがタイマーコールバックに関連付けられている場合、タイムアウトが発生するまでオブジェクトは解放されません。このシナリオでは、タイマーは自動的にリセットされ、ガベージコレクターによるメモリの削除を禁止することにより、タイムアウトが完了するまで永久に実行されます。これらのタイマーは、JavaScriptでのメモリリークの最も頻繁な原因です。

次の例では、タイマーコールバックとその関連付けられたオブジェクト(tiedObject)は、タイムアウトが終了するまで解放されません。その間、タイマーは自動的にリセットされて永久に実行されるため、元のオブジェクトへの参照がなくても、そのメモリスペースが収集されることはありません。

<html>
<body>
<script>
   for (var i = 0; i < 100000; i++) {
   var tiedObject = {
   callAgain: function() {
      var text = this;
      var value = setTimeout(function() {
      text.callAgain();
      }, 100000);
   }
   }
   tiedObject.callAgain();
   tiedObject = null;
   }
</script>
</body>>
</html>

メモリリークの回避

1.リークを回避するには、setInterval()/ setTimeout()内に参照を提供して、関数をガベージコレクションする前に実行する必要があるようにします。

2.関数が不要になったら、直接呼び出して関数を削除します。

IEなどの古いブラウザを除いて、chromeなどの最新のブラウザのほとんどはこの種の問題に直面しません。さらに重要なことに、jqueryのようなライブラリは、リークの問題が発生しないように内部で処理します。



  1. JavaScriptコールバック

    JavaScriptでは、関数はオブジェクトであるため、パラメーターとして別の関数に渡すことができます。これらの関数は別の関数内で呼び出すことができ、渡された関数はコールバック関数と呼ばれます。 以下はJavaScriptコールバックのコードです- 例 <!DOCTYPE html> <html> <head> <style>    body {       font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-seri

  2. リンクが#で始まる場合、JavaScriptクリック機能を無効にするにはどうすればよいですか?

    これには、JavaScriptでpreventDefault()を使用します。以下はJavaScriptコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title>