기본 유형 값은 정의되지 않은, 널, 부울, 숫자 및 문자열입니다. 이러한 유형은 메모리에서 고정 크기 공간을 차지하며 그 값은 스택 공간에 저장되며 값으로 액세스합니다.
(1) 값 유형 : 수치, 부울, 무효, 정의되지 않은.
(2) 참조 유형 : 객체, 배열, 함수.
지정된 값이 참조 유형 인 경우 힙 메모리 에서이 값에 공간을 할당해야합니다. 이러한 값의 크기는 고정되지 않았으므로 (객체에는 많은 속성과 방법이 있음) 메모리를 스택으로 저장할 수 없습니다. 그러나 메모리 주소 크기가 고정되므로 스택 메모리에 메모리 주소를 저장할 수 있습니다.
<script type = "text/javaScript"> var box = new Object (); // 참조 유형 생성 var box = "lee"; // 기본 유형 값은 문자열 상자입니다 .age = 23; // 객체 만 속성을 추가 할 수 있으므로 기본 유형 값에 속성을 추가하는 것이 이상합니다. 경고 (box.age); // 참조 유형이 아니며 출력 할 수 없습니다; </script>
요컨대, 힙 메모리는 참조 값을 저장하고 스택 메모리는 고정 유형 값을 저장합니다.
<script type = "text/javaScript"> var man = new Object (); // 사람은 스택 메모리 man.name = "jack"의 공간 주소를 가리 킵니다. var man2 = man; // man2는 사람의 포인팅 경고 (man2.name)의 주소를 얻습니다. // 둘 다 Jack Alert (man.name); </script>
변수 값을 복사하십시오
다음 예를 살펴 보겠습니다.
<script type = "text/javaScript"> var man = new Object (); // 사람은 스택 메모리 man.name = "jack"의 공간 주소를 가리 킵니다. var man2 = man; // man2는 사람의 가리키는 주소 주소를 얻습니다. man2.name = "ming"; // 모두 동일한 개체와 동일한 이름을 가리키기 때문에 누가 수정되었는지에 관계없이 모든 사람이 알림 (man2.name)을 수정했습니다.
위에서, 가변 복사 측면에서 기본 유형과 참조 유형도 다르다는 것을 알 수 있습니다. 기본 유형은 값 자체를 복사하고 참조 유형은 주소를 복사합니다.
매개 변수를 전달하십시오
ECMAScript에서는 함수의 모든 매개 변수가 값으로 전달됩니다.
<script type = "text/javaScript"> 함수 박스 (num) {// 값별로 num hum+= 10; Num 리턴; } var num = 10; var result = box (num); 경고 (결과); // 참조로 전달되면 함수의 NUM은 전역 변수가되고 외부의 숫자는 Alert (NUM)로 대체됩니다. // 다시 말해서, 20은 마지막에 출력해야합니다 (10은 여기에서 출력됩니다) </script>JavaScript는 참조로 전달되지 않습니다. 참조가있는 경우 함수의 변수는 글로벌 변수이며 외부에서도 액세스 할 수도 있습니다. 그러나 이것은 분명히 불가능합니다.
실행 환경 및 범위
실행 환경은 JavaScript에서 가장 중요한 개념 중 하나입니다. 실행 환경은 다른 데이터에 액세스 할 수있는 권한이있는 변수 또는 함수를 정의합니다.
글로벌 실행 환경은 가장 주변 실행 환경입니다. 웹 브라우저에서 글로벌 실행 환경은 창 객체입니다. 따라서 글로벌 변수의 모든 함수는 Windows의 속성 및 방법으로 생성됩니다.
<script type = "text/javaScript"> var name = "jack"; // 글로벌 변수 함수 정의 setName () {return "trigkit4"; } alert (window.name); // 가장 바깥 쪽 인 Global Variable은 Window 속성 Alert (Window.setName ())에 속합니다. // 가장 바깥 쪽의 글로벌 함수는 창 메소드 </script>에 속합니다실행 환경의 코드가 실행되면 환경이 파괴되고 저장된 변수와 기능도 파괴됩니다. 지구 환경 인 경우 모든 프로그램을 실행하거나 웹 페이지가 파괴되어야합니다.
var의 로컬 변수를 제거하십시오
<script type = "text/javaScript"> var name = "jack"; 함수 setName () {name = "trigkit4"; // var를 제거하고 글로벌 변수가되기} setName (); Alert (이름); // 팝업 Trigkit4 </script>매개 변수를 전달하면 로컬 변수입니다
<script type = "text/javaScript"> var name = "jack"; 함수 setName (name) {// 인수 전달 인수는 또한 로컬 변수 경고 (이름)입니다. } setName ( "trigkit4"); // 팝업 trigkit4 alert (name); // 팝업 Jack </script>함수는 또한 함수를 포함하고 있으며이 함수 만 함수의 내부 계층에 액세스 할 수 있습니다.
<script type = "text/javaScript"> var name = "jack"; function setName () {function setyear () {// setyear () 메소드의 범위는 setName () return 21 내에 있습니다. }} alert (setyear ()); // 액세스 할 수 없음, 오류 </script>다음과 같이 액세스 할 수 있습니다.
<script type = "text/javaScript"> var name = "jack"; function setName () {function setyear () {// setyear () 메소드의 범위는 setName () return 21 내에 있습니다. } return setyear (); } alert (setName ()); // POP 21 </script>다른 범위 예 :
<script type = "text/javaScript"> var name = "jack"; 함수 setName () {function setyear () {// setyear () 메소드의 범위는 setName () var b = "hi"에 있습니다. // 변수 b의 범위는 setyear () return 21에 있습니다. } alert (b); // innaccessible} </script>코드가 환경에서 실행되면 스코프 체인이라고하는 것이 형성됩니다. 그 목적은 실행 환경에서 액세스 권한으로 변수 및 기능에 대한 순서대로 액세스 할 수 있도록하는 것입니다 (규칙 수준에 따라 액세스를 참조). 스코프 체인의 프론트 엔드는 실행 환경의 가변 객체입니다.
범위
함수에서 변수가 선언되거나 선언되지 않은 경우 글로벌 변수이며 글로벌 범위가 있습니다. 윈도우 객체의 모든 속성에는 전역 범위가 있습니다. 코드의 어느 곳에서나 액세스 할 수 있으며 내부적으로 선언하고 Var로 수정 된 변수는 로컬 변수이며 기능 본문에서만 사용할 수 있습니다. 함수 매개 변수는 Var를 사용하지 않지만 여전히 로컬 변수입니다.
블록 수준 범위가 없습니다
블록 수준 범위가 없습니다
// 문 : <script type = "text/javaScript"> if (true) {// if 문의 곱슬 브레이스에는 범위 기능이 없습니다. var box = "trigkit4";} alert (box); // popt up trigkit4 </script>루프 명령문에 대해서도 마찬가지입니다.
변수 쿼리
변수 쿼리에서 로컬 변수에 액세스하는 것이 글로벌 변수보다 빠르므로 스코프 체인을 검색 할 필요가 없습니다.
다음 예에서 볼 수 있듯이 :
<script type = "text/javaScript"> var name = "jack"; 함수 setName () {var name = "trigkit4"; 반환 이름; // 하단 계층에서 변수를 검색} alert (setName ()); </스크립트>메모리 문제
JavaScript에는 자동 쓰레기 수집 메커니즘이 있으며 데이터가 더 이상 사용되지 않으면 기준을 해제하기 위해 "NULL"으로 설정할 수 있습니다.
재활용 참조
매우 간단한 예 : DOM 객체는 JavaScript 객체에 의해 참조되고 동시에 동일하거나 다른 JavaScript 객체를 나타냅니다. 이 DOM 객체는 메모리 누출을 유발할 수 있습니다. 이 DOM 객체에 대한 참조는 스크립트가 중지 될 때 쓰레기 수집기에 의해 재활용되지 않습니다. 원형 참조를 깨뜨리려면 DOM 요소 또는 DOM 객체에 대한 참조를 지칭하는 객체에 NULL 값이 할당되어야합니다.
폐쇄
폐쇄 외부에서 폐쇄에 변수를 도입 할 때,이 물체는 폐쇄가 끝나면 쓰레기를 수집 할 수 없습니다 (GC).
var a = function () {var largest = new Array (100000) .join ( 'x'); return function () {return largest; }} ();DOM 누출
원래 COM이 제거되면 제거되지 않으면 서브 노드 참조를 재활용 할 수 없습니다.
var select = document.querySelector; var treeref = select ( '#tree'); // com 트리에서 Leafref는 treefre var leafref = select ( '#leaf')의 어린이 노드입니다. var body = select ( 'body'); body.removechild (treeref); // #tree는 여전히 재활용 할 수 없습니다. treeref가 여전히 존재하기 때문에 // 솔루션 : treeref = null; // Leafref가 여전히 leafref = null; // #tree를 해제 할 수 있기 때문에 트리를 재활용 할 수 없습니다.
타이머 계량 (결정) 타이머 누출
타이머는 메모리 누출이 발생하는 일반적인 장소입니다.
for (var i = 0; i <90000; i ++) {var buggyobject = {callagain : function () {var ref = this; var val = settimeout (function () {ref.callagain ();}, 90000); }} buggyobject.callagain (); // 재활용을하고 싶지만 타이머는 여전히 버그 가기 = null;}입니다.메모리 디버깅
Chrome의 자체 메모리 디버깅 도구는 메모리 사용 및 메모리 누출을 쉽게 볼 수 있습니다.
타임 라인 -> 메모리에서 레코드를 클릭하십시오.