1. 잔소리
JavaScript 언어는 스크립트 언어의 유연성 외에도 고급 언어의 많은 기능을 갖추고 있습니다. 객체의 인스턴스화, 가비지 재활용 메커니즘(GC: Garbage Collection) 일반적으로 우리는 객체를 생성하기 위해 new를 사용하며, GC는 객체가 차지하는 메모리 영역을 재활용하는 역할을 담당합니다. 따라서 GC를 이해하면 JavaScript 가비지에 대한 이해가 깊어질 수 있습니다. 수집 메커니즘.
2. GC를 설명하려면 로컬 변수와 전역 변수를 사용하세요 GC는 메모리를 회수할 때 먼저 다른 개체 참조가 없는지 확인한 후 해당 개체를 참조합니다. , 객체 메모리가 해제됩니다. 따라서 객체가 더 이상 참조되지 않는지 확인하는 방법이 GC의 핵심입니다. 🎜> 코드는 다음과 같습니다.
<script> <a style="CURSOR: pointer" data="57752" class="copybut" id="copybut57752" onclick="doCopy('code57752')">function aa(){ <u>this.rr = "팝업 창" </u>} </a> function bb(){ </span>this.rr = "팝업 창" "; </div>} <div class="codebody" id="code57752">var b1; <br>function cc(){ <br>var a1 = new aa(); <br>b1 = new bb(); <br>return b1; } <br>cc() <br>alert(b1.rr) <br><br><br> <br>위 코드에서는 cc()를 실행한 후 a1이 재활용됩니다. b1.rr을 통해 텍스트 창을 띄울 수 있습니다. 일부 기본 서적에서는 a1이 전역 변수라고 설명되어 있습니다. 지역 변수는 실행 후 GC에 의해 재활용됩니다. 그러나 항상 그런 것은 아닙니다. 다음 코드는 <br><br><br><br><br>코드 복사<br><br>
</div>입니다. 코드는 다음과 같습니다:<br><br> <div class="codetitle"><script> <span>function aa(){ <a style="CURSOR: pointer" data="49466" class="copybut" id="copybut49466" onclick="doCopy('code49466')">this .rr = "팝업 창" <u>} </u>function bb( ){ </a>this.rr = "팝업 창"; </span>} </div>function cc(){ <div class="codebody" id="code49466">var a1 = new aa() <br>var b1 = new bb(); <br>return b1; <br>} <br>var b1 = cc(); <br>alert(b1.rr) <br>< ;/script> cc 함수의 a1 및 b1은 로컬 변수이지만 텍스트 창이 계속 나타납니다. 이는 b1이 GC에 의해 재활용되지 않았음을 의미합니다. 따라서 javascript의 로컬 변수가 항상 GC에 의해 재활용되는 것은 아닙니다. <br>3. GC의 추상적인 이해 <br><br>GC 재활용 메커니즘에 대해서는 더 많은 이해가 필요합니다. 이때 이중 연결 목록, 범위 체인, 활성 개체 등 여러 개념을 소개합니다(이해의 편의를 위해 원문의 개념을 단순화했습니다[http://softbbs.pconline.com.cn/9497825.html]. ]), 여기서는 이중 연결 리스트의 복잡한 객체의 상위 및 하위 계층 관계를 설명합니다. 범위 체인과 활성 객체는 각각 이중 연결 리스트의 노드입니다. cc 함수를 예로 들면, 가변 계층 관계는 다음과 같습니다. : <br>window<=>cc<=>a1<=> ;rr <br><=>b1<=>rr <br>(자세한 설명은 원문에 있음) cc( ) 메서드에서 메모리 내 변수의 참조 관계는 위와 같으며, 텍스트 설명은 다음과 같습니다. <br>window cc의 활성 개체에는 cc가 포함됩니다. 작업 중 재활용되지 않음) <br>cc의 활성 개체에는 a1 및 b1이 포함되며 범위 체인은 window입니다. <br>a1의 활성 개체에는 rr이 포함되며, 역할은 도메인 체인이 cc입니다. <br> 활성 개체의 b1에는 rr이 포함되어 있고 해당 스코프 체인은 cc입니다. </div> cc()가 실행되면 cc의 실행 환경은 활성 개체를 생성하고 해당 지역 변수 a1, b1은 cc의 활성 개체에 매달립니다. cc()가 실행되면 실행 환경은 활성 객체가 차지한 메모리를 회수하려고 시도합니다. 그러나 지역 변수 b1이 b1을 반환하므로 범위 체인이 여기에 추가됩니다. window ;b1 ;rr, 그래서 GC는 b1 재활용을 중단합니다. <br>따라서 지역 변수/함수를 전역으로 승격하려면 범위 체인을 추가하면 됩니다. <br>동시에 객체의 범위 체인을 제어하는 것도 중요합니다. 범위 체인으로 인해 실수로 GC가 대상 객체를 재활용할 수 없게 됩니다. 예: <strong><br></strong> <br><br>코드 복사<br><br><br> 코드는 다음과 같습니다. <br><br> <br><SCRIPT LANGUAGE="JavaScript"> <br>//cat<br>function cat( name){ <br>var zhuren; <div class="codetitle">this.name = name <span>//소유자 설정<a style="CURSOR: pointer" data="27440" class="copybut" id="copybut27440" onclick="doCopy('code27440')">this.addZhuRen = function(zr) <u>zhuren = zr; </u>} </a>this.getZhuRen = function(){ </span>return zhuren; </div>} <div class="codebody" id="code27440">} <br>//Master<br>function zhuren(이름) { <br>this.name = 이름; <br> } <br>//소유자 만들기: <br>var zr = new zhuren("zhangsan") <br>//고양이 만들기<br>var cat1 = new cat("asan");//고양이 소유자 설정<br>cat1.addZhuRen(zr) <br>//소유자 해제<br>zr = null; 또한 여기<br>alert(cat1.getZhuRen ().name) <br>//--> <br></SCRIPT>