タイマーやコールバックを忘れると、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のようなライブラリは、リークの問題が発生しないように内部で処理します。
-
JavaScriptコールバック
JavaScriptでは、関数はオブジェクトであるため、パラメーターとして別の関数に渡すことができます。これらの関数は別の関数内で呼び出すことができ、渡された関数はコールバック関数と呼ばれます。 以下はJavaScriptコールバックのコードです- 例 <!DOCTYPE html> <html> <head> <style> body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-seri
-
リンクが#で始まる場合、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>