2012-03-15 3 views
0

이 다중 레벨 중첩 JavaScript 객체를 고려하십시오. 함수 foo() 돌아 오면 자바에서 가비지 수집

function foo() { 
    var channels = { 
     2: { 
      name: "station 1", 
      description: "station1", 
      img: ["img1-a", "img1-b", "img1-c"] 
     }, 
     3: { 
      name: "station 2", 
      description: "station2", 
      img: ["img2-a", "img2-b", "img2-c"] 
     }, 
     4: { 
      name: "station 3", 
      description: "station3", 
      img: ["img3-a", "img3-b", "img3-c"] 
     }, 
    }; 

    console.log(channels);   
};   
....     
// calling foo. 
foo(); 

, 모든 자동 가비지 수집 개별 채널 객체, 문자열 배열 IMGIMG 배열의 문자열, 즉 모든 하위 개체 (?

또는, 내가 명시 적으로 "삭제"각 개체를 통해 반복하고해야합니까? 그들은 GC에 대한 자격

+2

더 이상 이러한 객체/배열에 대한 참조가 없으므로 결국 가비지 수집됩니다. –

+0

http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection을 참조하십시오. – j08691

+0

@FelixKling : 빠른 응답에 감사드립니다. – Karthik

답변

2

console.log의 상황에 따라 다릅니다. Chrome에서는 물론 channels 개체에 대한 참조가 콘솔에 유지되므로 channels을 GC 할 수 없습니다.

console.log을 제거하면 다른 참조가 없으므로 전체 channel 개체는 올바르게 GC됩니다.

+1

덕분에. 나는 콘솔을 생각하지 않았다. 로그. 그래서 클로저에있는 위의 객체 "채널"에 대한 참조를 유지한다면 _closure_에 대한 참조가 해제 되 자마자 메모리가 가비지 수집됩니다. 내가 맞습니까? – Karthik

2

한 아무것도로를 참조한다.

0

해당 channels 개체 또는 해당 개체가 포함 된 폐쇄에 대한 참조가 없기 때문에 가능합니다.

GC는 대부분 구현하는 브라우저에 따라 다르므로 실제로 수행된다는 보장은 없습니다. 그래도 각 요소는 과장되어 있습니다.

+0

감사합니다. Rob.의 답변과 함께 console.log에 대한 추가 정보를 얻었습니다. – Karthik

0

자바 스크립트에는 브라우저의 엔진 (v8 또는 기타)이 구현 한 자체 가비지 수집기가 있습니다. 참조를 할당 해제 할 필요는 없습니다. 루트가 범위를 벗어나면 모든 gc를 사용할 수 있습니다.