2014-01-30 7 views
1

module-esq 패턴을 사용하여 메소드의 체인을 허용하는 경우 반환 된 객체가 가비지 수집되기까지 얼마 동안 지속됩니까? jquery가 체인 메소드를 허용하는 방식을 정말 좋아하지만 코드에 패턴을 사용하면 많은 불필요한 객체가있는 페이지 메모리를 오염 시킬까 우려됩니다. 여기 함수에서 반환 된 객체의 수명주기

여기

(function(){ 
    // persistant variable wrapped in a closure 
    var prop = 'something'; 

    //module function 
    function house(){ 
     function method1(){ 
      console.log(prop); 
      return this; 
     } 
     function method2(value){ 
      prop = value 
      return this; 
     } 
     return { 
      getProp: method1, 
      setProp: method2 
     } 
    } 
    window.house = house; 
})(); 

/* 
* I am wanting to know how long the returned object will last in memory 
*/ 

house().setProp('somethingElse'); 

더 실제 예입니다 간단한 예입니다 :

(function(){ 
    // object cache to store all the elem id's that have been called 
    var _elemIds = {}; 

    function get(elem){ 

     if(!_elemIds[elem]){ 
      // add to _elemIds object if doesn't exist 
      _elemIds[elem] = document.getElementById(elem); 
     } 

     var _currentElem = _elemIds[elem]; 

     // set a css property using a json object, or get with a string 
     function css(){ 
      if(typeof arguments[0] === 'object'){ 
       for(x in arguments[0]){ 
        _currentElem.style[x] = arguments[0][x]; 
       } 
       return this; 
      } 
      else if(typeof arguments[0] === 'string'){ 
       var l = arguments.length; 
       // if more than one argument return an array 
       if(l > 1){ 
        var ret = []; 
        for (var i = 0; i < l; i++) { 
         if(_currentElem.style[arguments[0]] !== ''){ 
          ret.push(_currentElem.style[arguments[i]]); 
         } else { 
          ret.push(window.getComputedStyle(_currentElem, null)[arguments[i]]); 
         } 
        } 
        return ret; 
       } else { 
        if(_currentElem.style[arguments[0]] !== ''){ 
         return _currentElem.style[arguments[0]]; 
        } else { 
         return window.getComputedStyle(_currentElem, null)[arguments[0]]; 
        } 
       } 
      } 
     } 

     // change the color of the text 
     function color(color){ 
      _currentElem.style.color = color; 
      return this; 
     } 

     // log the current element 
     function test(){ 
      console.log('currentElem id: ' + _currentElem.id); 
      return this; 
     } 

     // return the public methods 
     return { 
      css: css, 
      current: test, 
      color: color 
     } 
    }; 
    // set the get method to the global object 
    window.get = get; 

})(); 

당신은 같은 것을 사용하는 것이 위의 코드에서 메서드에 액세스 할 수

get('elemId').css(('prop': 'value'}).current().css('prop'); 

어떤 답변을 주셔서 감사합니다. 당신이이 질문에 읽어야 우선

건배,

앤드류

답변

1

음, 그런 다음 Learning garbage collection theory

, 당신은 그래서이 모든 자바 스크립트 실행이 자신의 매우 구체적인 GC를 구현하는 것이 알 필요가 객체가 가비지 수집되는시기와 방법에 대해 절대적으로 규칙 없음입니다. 일단 그들이 참조되지 않으면 당신은 그들이 영원히 사라 졌다고 생각해야하고, GC는 객체가 참조 해제 된 후에 "최적의 시간"에 메모리를 해제 할 것이라고 신뢰합니다.

각 GC에 대한 구체적인 정보를 얻으려면 운좋게도 3 가지 주요 엔진이 있습니다!

나는 모든 링크가 완전한 아니에요 확신 해요,하지만 난 당신이 모든에 대한 자세한 내용을 배울 수있는 좋은 출발점 같아요 세 가지 JS 엔진의 GC에 대한 세부 사항!

+0

모든 참조 주셔서 감사합니다. @zmo 나는 그것들을 읽을 것입니다. 나는 단순한 용어로 묻고 자하는 것이 가장 기본적인 자주 반복되는 기능을 수행하는 좋은 방법이라고 생각한다. 나는 HTMLElements, 노드 변경, 텍스트 변경, 아약스 요청, 이벤트 추가 및 스타일 변경을 항상 배우기 위해 계속 배우고 있습니다. 나는 이것을 아주 쉽게 미니 라이브러리로 추상화 할 수 있다고 생각하지만 이것이 내가 따라야하는 패턴인지는 확실하지 않다. – synthet1c