패킷 닫기와 메모리 문제

3447 단어
하나.폐쇄적 운용
가방을 닫는 용도를 살펴봅시다.사실 클립을 사용하면 우리는 많은 일을 할 수 있다.예를 들어 대상을 향한 코드 스타일을 시뮬레이션한다.코드를 더욱 우아하고 간결하게 표현한다.어떤 면에서 코드의 집행 효율을 향상시키다.
  • 익명 자동 실행 함수
  • 실제 상황에서 한 번만 실행하면 되는 함수가 있고 UI의 초기화와 같은 내부 변수는 유지 보수가 필요 없으므로 클립을 사용할 수 있습니다.
    //모든 리 글꼴을 빨간색으로 변경(function() {var els = document.get Elements ByTagName('li'), for(var i = 0, lng = els.length, i 우리는 익명의 함수를 만들고 즉시 그것을 실행합니다. 외부에서 내부의 변수를 인용할 수 없기 때문에els, i, lng 등 국부 변수는 실행이 끝난 후에 곧 방출되고 메모리를 절약할 수 있습니다.관건은 이런 메커니즘이 전체 국면의 대상을 오염시키지 않는다는 것이다.
  • 패키지/모듈식 코드 구현
  • var person = function () {//변수 역할 영역은 함수 내부이고 외부에서 var name = "default"에 접근할 수 없습니다.
    return {    
       getName : function(){    
           return name;    
       },    
       setName : function(newName){    
           name = newName;    
       }    
    }    
    

    }(); console.log(person.name);//직접 액세스, 결과는 undefined console.log(person.getName());//default person.setName("jozo"); console.log(person.getName());//jozo
  • 대상 중의 대상을 대상으로 이렇게 서로 다른 대상(류의 실례)이 독립된 구성원과 상태를 가지고 서로 간섭하지 않도록 실현한다.JavaScript에는 클래스와 같은 메커니즘이 없지만, 클립을 사용하면 이러한 메커니즘을 모의할 수 있다.또는 위의 예를 들어 보면
  • function Person(){ var name = "default";
    return {    
       getName : function(){    
           return name;    
       },    
       setName : function(newName){    
           name = newName;    
       }    
    }    
    

    };
    var person1= Person(); print(person1.getName()); john.setName("person1"); print(person1.getName());//person1
    var person2= Person(); print(person2.getName()); jack.setName("erson2"); print(erson2.getName());//person2
    Person의 두 실례는 Person1과 Person2가 서로 간섭하지 않습니다!이 두 가지 실례가name 구성원에 대한 접근은 독립적이기 때문이다.둘.메모리 유출 및 솔루션
    쓰레기 회수 메커니즘
    메모리 관리에 대해 말하자면 JS의 쓰레기 회수 메커니즘과 떨어질 수 없다. 쓰레기 회수를 실현하는 두 가지 전략이 있는데 그것이 바로 표지 제거와 인용 계수이다.
    태그 지우기: 스팸 수집기는 실행할 때 메모리에 저장된 모든 변수에 태그를 붙인다. 그리고 환경에 있는 변수의 태그와 환경에 있는 변수가 인용된 변수의 태그를 제거한다. 이후에 변수가 다시 표시되면 이 변수가 삭제될 준비가 되어 있음을 나타낸다.2008년까지 IE,Firefox,opera,chrome,Safari의javascript는 모두 이 방식을 사용했다.
    인용 계수: 모든 값이 인용되는 횟수를 추적하여 기록합니다. 하나의 변수를 설명하고 인용 형식의 값을 이 변수에 부여할 때 이 값의 인용 횟수는 1입니다. 만약 이 값이 다른 변수에 부여된다면 인용 횟수는 1을 추가합니다.반대로 변수가 이 값의 인용에서 벗어나면 이 값의 인용 횟수가 1로 줄어들고, 횟수가 0일 때 쓰레기 수집기의 회수를 기다린다.
    이 방식에 비교적 큰 문제가 존재한다. 바로 순환 인용이다. 즉, A 대상은 B를 가리키는 지침을 포함하고 대상 B도 A를 가리키는 인용을 포함한다.이것은 대량의 메모리를 회수하지 못하게 할 수도 있다. 왜냐하면 그들의 인용 횟수가 영원히 0일 수 없기 때문이다.초기의 IE버전(ie4-ie6)에서 계수적인 쓰레기 회수 메커니즘을 사용했는데 패키지를 닫아서 메모리가 유출된 원인 중 하나가 바로 이 알고리즘의 결함이다.
    우리는 IE의 일부 대상이 원생액javascript 대상이 아니라는 것을 알고 있다. 예를 들어 BOM과DOM의 대상은COM 대상의 형식으로 이루어진 것이고COM 대상의 쓰레기 회수 메커니즘은 인용계수를 채택한 것이다.따라서 IE의javascript 엔진은 태그 제거 정책을 사용하지만 COM 대상에 접근하는 것은 인용 계수를 바탕으로 하기 때문에 IE에서COM 대상을 설계하면 순환 인용 문제가 존재합니다!
    밤을 들다.
    window.onload = function(){ var el = document.getElementById("id"); el.onclick = function(){ alert(el.id); } }
    이 코드는 왜 메모리 유출을 초래합니까?
    el.onclick= function () { alert(el.id); };
    이 코드를 실행할 때 익명 함수 대상을el의 onclick 속성에 부여하기;그리고 익명 함수 내부에el 대상을 인용하여 순환 인용이 존재하기 때문에 회수할 수 없습니다.
    해결 방법:
    window.onload = function () {var el = document.getElementById ("id"), var id = el.id;//순환 인용 해제el.onclick = function () {alert (id);el = null;//패킷을 닫고 인용된 외부 함수에서 활성 대상을 제거합니다}
    셋.폐쇄적 인 장단점 을 총결 하다
    이점:
                (           
             
         
    

    결점

    좋은 웹페이지 즐겨찾기