1

아직 참조 및 가비지 수집기가 자바 스크립트에서 작동하는 방식을 배우고 있으므로 부풀려진 부분과 누출을 줄일 수있는 방법을 배우게됩니다. 오브젝트를 보관 유지하는 팩토리를 작성합니다. 오브젝트에 건네지거나 값을 취득 할 수 있습니다.객체를 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는 객체가 생성되면 객체와 아무런 관련이없는 문자열을 반환하며, 객체에 대한 참조가 전혀없는 문자열 객체입니다. 원하는 개체와 문자열을 수정할 수 있으며 완전히 관련이 없습니다. –

답변

0

개체가 함수 인수 목록의 개체 리터럴에서 만들어지기 때문에 set() 함수 외부 개체에 대한 참조가 없습니다. 유일한 참조는 로컬 변수 value이며, set() 함수가 해당 변수를 반환하면 객체가 가비지 수집 될 수 있습니다. 따라서 다른 모든 변수가 참조하는 값이 아닌 리터럴도 포함하므로 모든 속성을 사용할 수 있습니다.

"개체를 문자열로 바꾸지"않았다면 단순히 개체의 표현이 포함 된 새 문자열을 만들었을뿐입니다. 문자열과 객체는 완전히 독립적입니다.

+0

감사합니다, @Barmar. 한 가지만 더 설명하면됩니다. value = JSON.stringify (value) - 그러면 누수가 발생합니까? 그것은 그 자체를 가리키고 있기 때문입니다. 마지막으로 lib [id] = null, 가비지 수집기에서 수집합니까? –

+0

아니요, 누출이 발생하지 않습니다. 변수가 객체를 가리 키지 않으면 객체는 가비지가됩니다. 매우 간단합니다 : 객체에 접근 할 방법이 없다면, 그것은 쓰레기이고 수집됩니다. – Barmar

관련 문제