2017-10-27 16 views
0

私は、次の機能を持っている:私はそれを呼び出している関数にsetTimeout()を呼び出すメモリの問題?

var counter = 0; 

test(); 

function test() { 
    counter++; 
    alert(counter); 
    setTimeout(function() { test() }, 100); 
} 

これは、メモリに問題を作成しますか?つまり、test()関数はsetTimeout()によって再び呼び出される前に正常に終了するでしょうか?

私のテストでは、関数を再度呼び出す前に終了していることが示されていますが、同僚がメモリの問題を引き起こすことは確実です。

更新: Chromeでテストを行い、タスクマネージャーを監視していて、メモリの使用状況は変わりませんでした。

testSetTimeout(0); 

function testSetTimeout(a) { 
    $("body").html(a); 
    var v = new Array(); 
    for (var i = 0; i < 20000; i++) 
     v.push("abcdefghijklmnopqrstuvwxyz"); 
    setTimeout(function() { testSetTimeout(a + 1); }, 0); 
} 

しかしながら直接testSetTimeout()を呼び出すために、このコードを変更するとき、それは約8000回実行した後、Chromeで、アウトcrapped。

+0

これはメモリの問題を引き起こす可能性がどのように表示されません。 'setTimeout'はその引数を呼び出し元と同じ関数呼び出しスタック上で直ちに実行しません。あなたの同僚が問題の可能性があると感じたら、問題を示すべきである。 – Amy

答えて

0

呼び出しはsetTimeoutメソッドの機能ではなく、テスト()の呼び出しスタックに置かれる)(テストするので、あなたがスタック

+0

それは私が思っていたもので、完璧な意味があります。 –

-1

はいを​​爆破しませんので、あなたが言ったようにあなたは、微細でなければなりませんメモリの問題が発生します。 test()が初めて呼び出されたときsetTimeout()は初期トリガの範囲を維持します。すべての関数呼び出しはsetTimeout()をスタックに保持し、スタックがいっぱいになるためメモリリークが発生します。

var counter = 0; 

test(); 

function test() { 
    counter++; 
    if(counter >20) return; // This will make the function to exit. 
    setTimeout(function() { test() }, 100); 
} 
+0

これは間違っています。 'setTimeout'は呼び出し関数スタック上でその引数を起動しません。 "setTimeout()によって実行されるコードは、setTimeoutが呼び出された関数とは別の実行コンテキストから呼び出されます。"これは、* new *コールスタック上で実行されます。 'test()'が自分自身を呼び出すことによって直接呼び出された場合は、yesを返します。答えは正しいでしょう。 – Amy

+0

私のテストコードは、少なくともChromeではメモリリークがないことを確認しています –

0

test()が呼び出されるたびに、その新しいインスタンスが作成されます。そのインスタンスは、それが呼び出された場所との関係を維持しなければなりません。そうでなければ、ゾンビになります。コード内に自己複製ゾンビがあるときは、それは良いコードではありません。一方、ゾンビにならず、どこから呼び出されたのかについての参照を保持している場合、基本的にメモリリークである意図しない再帰があります。これを行うには、メモリを無駄にする適切な方法はありません:

setInterval(test, 100}; 
function test(){ 
    doWHATEVER… 
}