2011-04-27 4 views
2
//Following function add new table entry to table 
//and return interface which has function which uses closure to access and update the table 
var _newRow = (function(){ 
    var _interface = { 
     updateName: null, 
     updateProgress: null, 
     actionLinkButton : null,//<a> tag used for user aciton to perform on UI like delete, hide, show etc. 
     .. 
     .. 
     .. 
    }; 
    var tr = createTr();  
    var tdName = createTd(); 
    _inteface.updateName = function(newName){ 
     tdName.innerHTML = newName; 
    } 
    .. 
    .. 
    .. 
    .. 
    .. 
    return _interface; 
})(tblObject); 

//maintaining the array of all the rows as per row number 
rowArray[rowNo] = _newRow; 
.. 
.. 
//using the row array to update the entries 
rowArray[rowNo].updateProgress('read'); 

위의 내용은 클라이언트 쪽에서 동적으로 추가 된 행을 업데이트하는 데 사용한 패턴입니다. 내가 할 일은 테이블에 행을 추가하는 동안 _interface를 만들고 반환하고 행 번호별로 저장하는 것입니다.자바 스크립트 클로저 및 메모리 문제

그러나 이것을 위해 나는 클로저를 사용하여 많은 살아있는 개체를 의미합니다. 이 올바른 방법인지 알고 싶습니다. 이게 더 나은 접근법인가? 이 코드가 얼마나 많은 memeory를 사용하고 있는지 알기 위해 사용할 수있는 프로파일 링 도구는 무엇입니까? 클로저가 필요하지 않을 때 제대로 지워지도록하려면 어떻게해야합니까?

+0

FireFox 용 플러그인 인 http://getfirebug.com/을 보거나 Webkit 브라우저 (Google Chrome, Safari)에서 프로파일 러를 빌드하십시오. – Kevin

+1

예, 사용 중입니다. 그러나 그것은 메모리와 힙 크기를 나타내지 않습니다. 또한 잘못된 관행이나 메모리 크기가 증가하지 않습니다. 다른 도구가 있습니까? –

답변

0

자바 스크립트는 누락 된 개체를 수집하고 자동으로 할당을 취소하는 가비지 수집기가 있습니다. 언제 또는 어떻게 제어 할 수있는 방법이 없습니다.

개체/클로저가 가비지 수집되지 않도록 방지하려면 어휘 범위가있는 함수를 참조하는 전역 액세스 가능 개체가 있어야합니다. 사용하지 않는 모든 값을 분리해야합니다 (예 : DOM에서 값을 제거하는 경우). 값에 액세스 할 수있는 방법이 없다면 결국에는 가비지 수집됩니다.

메모리 누수를 확인하려면 조기에 최적화하지 않는 것이 중요합니다. 웹 브라우저의 메모리 사용량을 모니터링 할 수 있습니다. 눈에 띄지 않으면 걱정하지 않아도됩니다. 앱을 오랫동안 실행 한 후 상태가 어떻게 보이는지 알아 보려면 앱에서 많은 작업을 시뮬레이션하고 싶을 수 있습니다.

하지만 일반적으로 메모리 사용에 대해서는 걱정하지 마십시오. 그것은 내 경험에 거의 문제가되지 않습니다.