1

私はまだ参照とガベージコレクタがjavascriptでどのように動作しているかを知っています。オブジェクトを保持しているファクトリを作成します。オブジェクトに渡すか、そこから取得することができます。オブジェクトをJSON文字列に変換してnullにします

.factory('lib', function(){ 
    var lib={}; 
    return { 
    set: function(id,value,isObj){ 
     if(isObj){ 
     lib[id]=JSON.stringify(value); 
     }else{ 
     lib[id]=value; 
     } 
    }, 
    del: function(id){ 
     lib[id]=null; 
    } 
    }; 
}) 

.controller('testCtrl',function(lib,$timeout){ 
    lib.set("1",{'name':'James','sureName':'Potter'},true); 
    $timeout(function(){ 
    lib.del("1"); 
    },1000); 
}) 

私の質問は次のとおりです。 objを文字列に変換し、後で文字列を返し、現在はnull値として返します。私の元のobjは到達可能で、ガベージコレクタによって収集されますか?また、私は文字列に変換しようとobjのプロパティに何が起こる?

+0

JSON.stringifyは、オブジェクトが作成されるとオブジェクトとは関係のない文字列を返します。オブジェクトへの参照を一切持たない文字列オブジェクトです。あなたはオブジェクトと文字列を自由に変更することができ、完全に無関係です。ありがとう、@ Barmar。 –

答えて

0

オブジェクトは関数の引数リストのオブジェクトリテラルから作成されるため、set()関数外のオブジェクトへの参照はありません。唯一の参照はローカル変数valueで、set()関数がその変数を返すときに、そのオブジェクトがガベージコレクションされるようになります。他の変数が参照する値ではなく、リテラルも含んでいるので、すべてのプロパティもそうすることができます。

「オブジェクトを文字列に変換していませんでした」というのは、単にオブジェクトの表現を含む新しい文字列を作成しただけです。文字列とオブジェクトは完全に独立しています。

+0

もう一つ、何かを明確にすること。 value = JSON.stringify(value) - リークの原因になりますか?それはそれ自身を指しているからです。最後にlib [id] = null、ガベージコレクタによって収集されますか? –

+0

いいえ、リークは発生しません。変数がオブジェクトを指し示すのを止めると、オブジェクトはゴミになります。それは非常に簡単です:オブジェクトにアクセスする方法がない場合、それはゴミであり、収集されます。 – Barmar

関連する問題