(B) 자바 스크립트 변수 범위 및 메모리 문제

소개

은 ECMA-262의 정의에 의하면, 자바 스크립트 변수는 매우 다른 언어와 다른 변수입니다. 자바 스크립트의 변수가 있기 때문에 느슨한 타입 , 변수의 값데이터 유형은 스크립트가 될 수 수명주기를 변경하려면 어떤 방법으로,이 재미 있고 강력뿐만 아니라 쉬운 특성 문제,하지만 훨씬 복잡의 실제 정도 그것보다 훨씬 더.

값 형식과 참조의 기본 유형

ECMAScript를 다른 데이터 유형 :( 두 변수 값을 포함 할 수있는 베이스 타입참조 타입 )

  • 기본 유형 : 간단한 데이터 세그먼트 ( 정의되지 않은, 널, 부울, 숫자, 문자열은 당신이 변수에 저장된 실제 값을 조작 할 수 있기 때문에)이 값은 액세스의 다섯 가지 유형을 기반으로합니다.
  • 참조 형식 (값 복수 형성된 물체 오브젝트 ), 값 유형의 메모리에 저장된 참조 객체. 다른 언어와는 달리, 자바 스크립트를 직접 허용하지 않는 메모리 조작 개체를 . 동작에있어서의 오브젝트 조작에 실제로 오브젝트 참조 오히려 실제 객체보다는. 기준치에 의해 액세스하는 경우 참조 형.

값이 변수에 할당 된 경우, 파서는이 값이 결정해야 기본형 또는 참조 유형 .

팁 : 대부분의 언어, 객체의 문자열 표현의 형태는 참조 유형으로 간주됩니다. ECMAScrip는이 전통을 제공합니다.

동적 속성

이후의 동작의 종류에 대해 생성 된 변수에 저장된 기본 타입과 참조와 유사한 방식으로 정의 유형, 값은 실행 가능 값은 상이 할 수있다.

등 두 가지를 다음과 같이 :

  1. 기본 유형

    // 基本类型无法添加属性,尽管这样做不会导致任何错误。
    var name = "Nicholas";
    name.age = 27;
    alert(name.age); // undefined
  2. 참조 유형

    // 但引用类型却可以动态的添加属性,如果对象不销毁或属性不被删除,则这个属性一直存在。
    var person = new Object();
    person.name = "Nicholas";
    alert(person.name);

변수의 값을 복사

  • 다른 방식의 저장 외에도에서 가변 다른 변수 복사 기본형 값기준값 형 상이한있다.

기본 유형의 값 복사 일어날 것이다 :

var num1 = 5;    // num1 在栈中开辟空间存值 5
var num2 = num1; // num2 在栈中开辟空间存值(从 num1 空间复制过来的 5)
// 两个变量的空间都是独立存在的并没有任何关联。
// 相当于 num1开一间房,num2开一间房,num2 叫了一份和 num1 一样的外卖。

참조 유형의 값 복사 일어날 것이다 :

var obj1 = new Object(); // obj1 在栈中开辟空间存对象的地址,对象存放在堆内存中。
var obj2 = obj1;         // obj2 在栈中开辟空间存 obj1保存的地址,可操作 obj1 的对象。
obj1.name = "Nicholas";  
alert(obj2.name); // Nicholas
// 当 obj2 复制 obj1 变量时,两个变量同时指向一个 对象,相当于两家人有一个共同的仓库。

매개 변수 전달

  • ECMAScript를 함수는 모든 파라미터 함수의 값의 복사본의 외부 파라미터의 함수 값에 의해 전달된다.

    의 기능 수신 파라미터 기본 파라미터 때를 :

    function addTen(num) {
      num += 10;
      return num;
    }
    
    var count = 20;
    var result = addTen(count);
    alert(count); // 20,没有变化
    alert(result);// 30
    
    // 简单理解:result 叫了addTen函数的参数 叫了一份 count一样的外卖,加了特技,返回给他
    // 而 addTen函数并没有修改 count 所以没任何变化

    기능 수신 매개 변수 유형 참조를 할 때 :

    function setName(obj){
      obj.name = "Nicholas";
      obj = new Object();
      obj.name = "Greg";
    }
    var person = new Object();
    setName(person);
    alert(person.name); // "Nicholas"
    /*
      可以看上面的 复制引用变量值,自行领会。 
      我发现我竟然无法言语解释。
    */

감지 유형

변수는 운영자가 최고의 도구이지만, 변수가 객체 또는 null의 경우의 typeof 개체 개체가 반환됩니다 tyepof, 기본 데이터 형식이 아닌 경우 감지합니다.

검출의 기본적인 유형은 매우 유능한 조수하지만 운영자 사용이 유형의 검출 작은 기준값 있지만. 그러나 우리는 객체의 유형의 값이 무엇인지 알고 싶어요. 목적은 ECMA 스크립트를 제공하기 instanceof는 운영자

result = variable instanceof constructor
// 如果变量是给定引用类型
alert(person instanceof Object);  // 变量 person  是 Object 吗?
alert(colors instanceof Array);   // 变量 colors  是 Array  吗?
alert(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

규정에 따르면, 모든 참조 형식의 값은 객체의 인스턴스입니다 ..

  • 때 참조 유형, 항상 instanceof를 감지 개체가 true를 돌려
  • instanceof를 항상 false를 반환 원시 값을 감지

범위 및 실행 환경

이라고도 실행 환경 (실행 환경) 환경 , 자바 스크립트는 가장 중요한 개념이다. 실행 환경은 정의 변수 또는 함수를 받을 권리가 액세스 다른 데이터를 자신의 동작을 결정합니다. 각 실행 환경과 연결되어 가변 객체 (객체 변수), 환경에 정의 된 모든 변수 및 함수는이 오브젝트에 저장된다. 이 객체에게 글을 쓰는 시점에 액세스 할 수 있지만 데이터를 처리하는 동안 파서는 배경에서 사용되지만.

var color = "blue";
function changeColor(){
  var anotherColor = "red";
  function swapColors(){
    var tempColor = anotherColor;
    anotherColor = color;
    color = tempColor;
    
    // 这里可以访问 color、anotherColor 和 tempColor
  }
  
  // 这里可以访问 color 和 anotherColor 但不能访问 tempColor
  swapColors();
}

// 这里只能访问 color
changeColor();
  • 내부 환경의 범위 체인을 통해 외부 환경을 모두 액세스 할 수있다 , 그러나, 외부 환경은 어떤 변수와 함수 내부 환경에 액세스 할 수있다.
  • 환경 사이의 연결은, 순차적 선형이다.
  • 각 환경 질의 변수 및 함수 범위 체인을 검색 할 수있다;
  • 그러나, 어떤 환경 수없는 범위 체인 실행 환경 아래로 다른 검색하여.
  • 함수 매개 변수는 변수로 간주되는 것과 동일한 실행 환경에서 상기 액세스 규칙 및 다른 변수 그래서.

범위 체인 확장

실행 환경 :( 두 가지 유형 의 글로벌로컬 (기능))는, 그러나 유효 범위 체인을 확장하는 다른 방법이있다.

예를 들어, 일부 진술 일시적 코드가 실행 된 후 범위 체인의 전면에 가변 객체 변수 객체가 제거 될 예정 증가시킬 수있다.

이러한 현상이 발생하는 두 가지 경우가 있습니다 :

// 当执行流进入下列任何一个语句时,作用域就会得到加长
try-catch 语句的 catch 块;
with 语句

두 문은 범위의 프런트 엔드에서 변수 객체를 추가합니다.

  • 문에 들어, 범위 체인에 지정된 개체를 추가합니다.

  • catch 문에, 그것은 오류 개체가 throw 선언이 포함 된 새 변수 객체를 생성합니다.

// 例如
function buildUrl(){
  var qs = "?debug=true";

  with(location){
    var url = href + qs;
  }

  return url;
}
  1. 문으로 오브젝트 위치, 따라서 목적 변수 특성 및 위치 객체의 모든 방법을 포함한다 받아들이고,이 목적은 가변 범위 체인 전단에 첨가되어있다.
  2. buildURL () 함수는 변수 QS를 정의한다. 기준 변수 명령문 (실제 인용 같이 location.href이다) HREF 때 변수가 현재의 실행 환경의 개체에서 찾을 수있다.
  3. 기준 변수 QS는 변수 buildUrl ()에서 정의되는 참조하는 가변 반면 변수 객체 함수 환경 인 경우.
  4. 내부 문으로 정의 된 바와 같이, 변수는 URL, URL 이름 때문에이 함수의 값으로 복귀 할 수 있고, 기능 실행 환경의 일부가되었다.

어떤 블록 레벨 범위가 없습니다

  1. 자바 스크립트는 블록 레벨 범위가 종종 이해에 혼란으로 이어질 것 없습니다. 조건에 따라 변수를 정의하는 지지체 (인 ECMAScript의 단어를 사용하여 자신의 실행 환경 인 경우) 중괄호 다른 언어 C에서, 코드 블록은 그 자신의 범위를 갖는다.
// 例如,下面代码在 JavaScript 中并不会得到想象中的结构:
if (true) {
  var color = "blue";
}

alert(color); // "blue"
在 if 语句中定义了变量 color ,如果在 C、C++或Java中,color 会在 if 语句执行完毕后被销毁。

但在JavaScript中,if 语句中的变量声明会将变量添加到当前的执行环境(在这里是全局环境中)。
  1. 특히,이 차이를 이용하여 문 예를 들어, 염두에 두어야합니다 :
for (var i=0;i < 10; i++){
  doSomething(i);
}
alert(i); // 10

블록 레벨 범위의 경우, 문 루프의 외부 환경에 존재할 것이다 정의 된 변수의 발현을위한 변수를 초기화한다.

자바 스크립트의 경우, 변수는 문 심지어 실행주기의 종료 후, 여전히 외부 루프의 실행 환경에 존재하는 것으로 만들었습니다.

  1. 선언 변수

    변수에서 VAR 선언은 자동으로 최근 환경에 추가됩니다 . 함수 내에서 가장 가까운 환경의 함수이다 지역의 환경은 , 가장 가까운 환경 성명에서 환경의 함수이다. 당신이 변수를 초기화하려면 var 문을 사용하지 않는 경우, 변수는 자동으로 지구 환경에 추가됩니다.

    function add(num1, num2){
     var sum = num1 + num2; // sum添加到函数的局部环境中
     return sum;
    }
    var result = add(10, 20); //30
    alert(sum);  // 由于 sum 不是有效的变量,因此会导致错误。

    결과는 함수로부터 복귀되었지만 합계라는 로컬 변수를 정의 ()는 상기 함수 코드를 추가 하지만, 가변 합계가 액세스 할 수없는 기능을하는 외부이다. 경우 생략, 이 예제에서 var 키워드 다음 추가 기능 때 구현 한 후 , SUM 액세스 할 수 있습니다 .

    function add(num1, num2){
     sum = num1 + num2; // sum添加到全局环境中
     return sum;
    }
    var result = add(10, 20); //30
    alert(sum);               //30

    위의 변수 합계의 예는 초기화 될 때 사용하지 않을 var에 키워드를 . 마무리 추가 ()를 호출, 경우에 따라서, 글로벌 환경에 추가 변수의 합이 존재하는 것, 함수가 종료되는 경우에도, 당신은 여전히 뒤에 코드에 액세스 할 수 있습니다.

  2. 쿼리 식별자

    순서 환경에서 읽기쓰기식별자를 참조 할 때 , 있어야 검색 이 있는지 결정하기 위해 무엇을 실제로 식별자를 나타냅니다 .

    주어진 이름과 일치하는 질의 식별자 및 업 스텝만큼 상기 범위 체인 앞 단계에서 과정이 시작을 찾는다. 지역 환경이 식별자를 찾을 경우 검색 과정은 변수 준비가 중지됩니다. 변수 이름은 로컬 환경에서 발견되지 않으면, 탐색은 범위 체인을 계속한다. 검색 과정은 지구 환경의 변수 오브젝트로를 추적하고있다. 당신은 글로벌 환경에서이 식별자를 찾지 못한 경우, 변수가 선언되지 않았 음을 의미합니다.

    // 通过下面的示例,可以理解标识符的过程
    var color = "blue";
    
    function getColor(){
     return color;
    }
    
    alert(getColor()); // "blue"

    이 쿼리 프로세스는, 지역의 지역 환경 변수를 찾아, 근접의 원리를 사용하며, 지구 환경을 찾아 그것을 찾을 수 없습니다, 당신의 정의를 찾을 수 없습니다.

    // 通过下面的示例,可以理解标识符的过程
    var color = "blue";
    
    function getColor(){
      var color = "red";
     return color;
    }
    
    alert(getColor()); // "red"

팁 : 변수 쿼리는 가격이없는 것은 아니다. 물론, 글로벌 변수와 로컬 변수 빠르고 더 상향 검색 범위 체인 없으므로. 내가 앞으로이 차이는 무시할 수 있다는 것을 두려워 있도록 자바 스크립트 엔진은 쿼리 식별자를 최적화 좋은 일을.

쓰레기 수거

자바 스크립트가 자동 가비지 수집 메커니즘 ,되어, 실행 환경은 관리 책임이 코드를 실행하는 프로세스 메모리 사용량을 .

C 및 C ++ 언어 클래스, 개발자의 기본 작업은 수동으로 많은 문제의 근본 원인이되는 메모리 사용을 추적하는 것입니다. 자바 스크립트 프로그램을 작성할 때, 개발자들은 더 이상 메모리, 필요한 메모리 할당 및 자동 관리의 쓸모없는 메모리 복구 완전한 실현의 사용에 대해 우려 할 필요가 없습니다.

원칙 다음 원칙은 더 이상 그 변수를 식별 계속 사용하려면 매우 간단한 자바 스크립트 가비지 수집 메커니즘, 다음 메모리를 확보하는 것입니다. 이를 위해, 가비지 컬렉터 (소정의 수집 시간에 실행되거나) 고정 된 시간 간격으로 주기적으로이 동작을 실행을 따를 것이다.

간단한 분석 : 로컬 변수 노멀 표명주기 함수는, 로컬 변수는 기능 실행시, 프로세스는 그 값을 저장하는 스택 (또는 힙) 메모리의 해당 공간에 할당 된 로컬 변수가 될 것이다 존재한다. 그런 함수의 실행이 종료 될 때까지 이러한 함수의 변수를 사용한다. 이 경우, 필요는 향후 사용을 위해 메모리를 해제 할 수 그래서, 지역 변수를 존재하지 않습니다. 이 경우, 존재에 필요한 변수 여부를 판단하기 쉽습니다,하지만 모든 경우에서 결과를 너무 쉽게있다. 가비지 컬렉터를 추적해야하는 쓸모에게 유용한 변수가 더 이상 유용한 변수에 대한 점유 메모리의 미래 복구를위한 마커로 표시된 변수. 브라우저의 실현을 구현 고유의, 그러나 특정 될 수있다 원치 않는 변수를 식별하기위한 전략은 일반적으로 두 가지 전략이있다.

클리어 라벨

가장 일반적으로 사용되는 자바 스크립트 가비지 컬렉션 지우기 (마크 앤 스윕을) 레이블이 붙어 있습니다.

  • 환경으로 변수 (예를 들어, 변수 함수 선언)하면,이 변수로 표시되는 "환경으로."

  • 환경 변수를 떠날 때, 그것은로 표시됩니다 "환경을 둡니다."

먼저 메모리에 저장된 모든 변수를 실행 가비지 수집기가 마커로 표시되는 경우, (표지는 어떠한 방식으로도 사용될 수있다).

이어서 , 그것을 제거 환경 변수참조 변수 환경 변수 분류한다. 그이 후 다시 그리고 변수에 의해 플래그 된 대로 처리됩니다 변수가 삭제 제조 된 환경 변수가 이러한 변수에 액세스 할 수 없습니다 되었기 때문에.

마지막으로 , 가비지 컬렉터 메모리 정리, 완료 의 파괴태그 값을 그들이 차지하는 메모리 공간을 확보.

참조 수

또 다른 적은 일반 쓰레기 수거 전략은 호출 참조 카운트 (참조 카운팅). 기준 카운트 값의 각각의 회수를 의미하는 실적을 참조한다.

  1. 값이 가변 타입에 할당 될 때 변수 참조 인용를 선언 할 때,이 값은 1이다.
  2. 동일한 참조 번호는 다른 변수에 할당 한 값이되면, 값이 증가된다.
  3. 다른 값을 변수 참조의 값을 포함하고 만든 반대로, 다음 기준 값은 1 씩 감소. 이 값이 0 인용,이 값을 액세스 한 후 어떠한 방식으로하고 메모리 공간을 복구 할 수있는 최대가되면.
  4. 가비지 수집기가 다음에 실행될 때, 그것은 점유 메모리의 값을 0으로 그 인용을 발표 할 예정이 방법에서는.

넷스케이프 네비게이터 3.0은 사용이 처음이다 참조 카운팅 전략 브라우저를하지만 곧 심각한 문제가 발생하여 다음 순환 참조 . 순환 참조 오브젝트 A는 오브젝트 B를 가리키는 포인터는, 오브젝트 B는 오브젝트 A를 참조하는 포인터를 포함 포함한다.

// 循环引用例子:
function problem(){
    var objectA = new Object();
    var objectB = new Object();
    
    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;
}

이를 위해, 넷스케이프는 가비지 컬렉션 메커니즘을 달성하기 위해 명확한 라벨에 찬성 참조 네비게이터 4.0의 계수를 포기했다. 그것은 종료 문제에 대한 참조 카운트를지도하지 않았다 있습니다.

  1. 우리는 IE가 개체의 일부 기본 자바 스크립트 개체가 아닙니다, 알고있다.

  2. 예 BOM과 DOM 객체 COM와 C는 ++ 가비지 콜렉션 참조 카운팅 전략을 사용하여 COM 객체 인 동안 (구성 요소 객체 모델, 컴포넌트 객체 모델) 구현 형태의 개체이다.

  3. 따라서, IE의 자바 스크립트 엔진은 표를 달성하기위한 명확한 전략을 사용하는 경우에도, 여전히 접근 자바 스크립트 COM은 참조 카운팅 전략을 기반으로 객체. 간단하게 IE COM 개체에 포함되는, 넣어, 순환 참조가 존재합니다.

    다음 예를 참조하십시오 :

    // 当出现循环引用,即使例子中的 DOM 从页面中移除,它也永远不会被回收。
    var element = document.getElementById('some_element');
    var myObject = new Object();
    myObject.element = element;
    element.someObject = myObject;
    
    // 为了避免循环引用问题,将变量设置为 null 意味着切断了变量与它此前引用的值之间的连接。
    myObject.element = null;
    element.someObject = null;
  4. 위의 문제를 해결하기 위해, IE9는 BOM 및 DOM 객체는 자바 스크립트 객체의 진정한 의미에 설정되어 있습니다. 따라서, 가비지 컬렉션 알고리즘 리드 두 종류의 공존을 피하기 위해,뿐만 아니라 일반적인 메모리 누수를 제거합니다.

성능 문제

가비지 콜렉션은 주기적으로 실행되고, 변수에 할당 된 메모리의 양이 목표 인 경우, 다음 복구 작업은 매우 크다.

시간 간격 가비지 콜렉션이 매우 중요한 문제입니다 결정하기 위해, 당신이 사건을 갉아 먹다. 그는 가비지 컬렉터는 IE 성능 문제를 연상하기 때문에 지저분한 번 이상, 실행했다.

  • IE 가비지 컬렉션은 메모리 할당, 특히 가변 256 점, 4096 객체 (또는 배열) 리터럴 배열 요소 (슬롯) 또는 64킬로바이트의 문자열에 따라 실행된다.
  • 임계 값 위의 달성, 가비지 컬렉터가 실행됩니다. 이 구현의 문제는 스크립트가 너무 많은 변수가 포함되어있는 경우, 스크립트의 수명주기에 너무 많은 변수를 유지해야 할 수도 있다는 점이다. 하고 있으므로에서는 가비지 수집기가 자주 실행해야합니다. 결과적으로 인한 심각한 성능 문제는 IE7이 다른 가비지 콜렉션 루틴을 다시 자극했다.
  • 트리거 변수 할당 가비지 컬렉션 리터럴 및 어레이 소자의 임계 값을 동적 (또는) 교정을 조정한다 : IE7의 방출에 의해, 자바 스크립트 엔진 가비지 컬렉션 루틴 작업을 바꿨다. IE7이 임계 값은 초기 IE6와 동일하다. 메모리 할당 루틴 가비지 컬렉션은 15 % 미만, 변수, 리터럴 임계 어레이 소자 (또는) 배가 될 것이다 회수하는 경우. 루틴이 85 %의 메모리 할당을 복구 할 경우, 다양한 임계 값은 기본값으로 다시 재설정합니다. 페이지는 자바 스크립트를 실행 다량 포함 된 경우이 단순 해 보이는 조정은 크게 IE의 성능을 향상시킬 수 있습니다.

팁 : 사실, 일부 브라우저는 가비지 수집 프로세스를 트리거 할 수 있지만, 우리가 그렇게 할 수있는 독자를하지 않는 것이 좋습니다. IE에서 즉시 window.CollectGarbage () 메소드를 수행 가비지 콜렉션을 호출한다. Opera7 이상에서) (window.opera.collect 전화 가비지 수집 루틴을 시작합니다.

메모리 관리

프로그램의 쓰레기 수집과 사용 언어는 개발자는 일반적으로 메모리 관리의 운영 문제가 발생하지 않습니다. 그러나, 자바 스크립트 메모리 관리와 쓰레기를 수집하는 동안 직면 한 문제는 여전히 약간의 다릅니다.

가장 중요한 문제는 웹 브라우저에 할당 가능한 메모리의 양이 보통보다 작 데스크톱 응용 프로그램에 할당된다. 이렇게의 주요 목적은 목적이 자바 스크립트 웹 모든 시스템 메모리를 소진 실행 방지하는 시스템이 중단 될 보안 고려 사항입니다.

메모리 제한 변수에 할당 된 메모리에 영향을 미칠뿐만 아니라, 호출 스택 동시에 실행할 수있는 하나 개의 스레드에서 문장의 수에 영향을 미칠 것입니다.

따라서, 페이지 성능 향상을 할 수있는 최소한의 메모리 풋 프린트를 보장합니다. 코드의 구현은 필요한 데이터를 저장하기위한 최적화 메모리 사용량에 가장 좋은 방법. 데이터는 바람직 null로의 참조를 해제하는 값을 설정함으로써, 더 이상 유용하지하면 -이 절차 호출 접촉 기준 (비 참조)를.

이 방법은 대부분의 속성 전역 변수와 개체에 적용됩니다. 그들은 예를 들어, 참조 된 실행 환경을 떠날 때 지역 변수가 자동으로 연락된다 :

function createPerson(name){
    var localPerson = new Object();
    localPerson.name = name;
    return localPerson;
}

var globalPerson = createPerson("nicholas");
// 手工解除 globalPerson 的引用
globalPerson = null;
  • 함수의 실행 환경을 완료 한 후 떠날 때, 우리는 그것을 도달하기 위해 명시 적으로 참조 할 필요가 없습니다.

  • 그러나 전역 변수는, 당신은 우리가 코드의 마지막 줄 위의 예제의 목적이다 그것에 대한 참조 설명서,과 접촉하지 않을 때 사용합니다.
  • 그러나, 기준값의 리프팅이 차지하는 메모리의 값의 자동 복구를 의미하지 않는다. 실제 역할을 올리려면이 복구 될 때 가비지 컬렉터의 다음 실행에 대한 실행 환경에서 참조 값을 확인하는 것입니다.

개요

  1. 자바 스크립트 변수는 두 가지 유형을 저장할 수 있습니다 :
  • 기본 유형 (정의되지 않은, 널, 부울, 숫자, 문자열)
  • 참조 유형 (객체)
  1. 기본 값유형의 기준값 은 다음 기능을 포함 :
  • 스택은 메모리에 저장되도록 고정 크기 값의 기본 유형의 메모리 공간을 차지한다;
  • 다른 변수 하나 개 변수에서 프리미티브 값을 복사하여, 그 값의 복사본을 생성한다;
  • 값이 힙 메모리에 기억 된 참조 타입 오브젝트이고;
  • 없음 목적은 기준 입력 변수의 값이 실제로 자체를 포함 포함하지만, 객체에 대한 포인터;
  • 마지막 두 변수가 동일한 피사체를 가리도록 또 다른 유형의 가변 기준 변수 값 복사 포인터 실제로 복사;
  • 사용할 수있는 조작 입력 대해서 typeof 실질적이고 때 값 instanceof 연산자 기준의 유형을 결정하는데 사용될 수있는 값을 결정
  1. (기본 타입과 참조 타입을 포함)의 모든 변수는 생명 변수 사이클, 어느 변수가 액세스 할 수있는 코드 부분을 실행 환경 사이에서 (도 범위라고도 함) 실행 환경에서 존재하는 결정이다.
    다음은 몇 가지 점에 대한 요약 실행 환경입니다 :

    • 실행 환경 전역 실행 환경 (도 지구 환경이라고도 함) 및 포인트의 기능의 실행 환경;

    • 새로운 실행 환경을 입력 할 때마다, 변수와 함수를 검색하는 데 사용되는 범위 체인을 만들 것이다;

    • 로컬 환경 기능은 변수 함수 영역에 액세스 할 수 있지만, 또한 (상위) 환경에 액세스하는 권리뿐만 아니라 지구 환경을 포함하지;

    • 당신은 환경 변수와 글로벌 환경에서 정의 함수 글로벌 액세스 할 수 있지만 로컬 환경에 직접 데이터에 액세스 할 수 없습니다;

    • 이 메모리를 확보해야 할 때 실행 환경 변수 도움이 결정;

  2. 자바 스크립트가 자동 가비지 수집 메커니즘을 가진 프로그래밍 언어 개발자는 메모리 할당 및 복구 문제에 대해 걱정할 필요가 없습니다.

    다음 자바 스크립트 가비지 수집 루틴은 다음과 같은 요약을 만들려면 :

    • 범위의 제한 값은 자동으로 재활용로 표시됩니다, 따라서 쓰레기를 수집하는 동안 삭제됩니다.
    • "명확한 표시가"주류 가비지 컬렉션 알고리즘,이 알고리즘의 아이디어는 현재 값을 더한 표시하는 데 사용하고 메모리를 복구하지 않습니다.
    • 이 알고리즘의 또 다른 가비지 컬렉션 알고리즘은 "참조 카운팅"아이디어는 참조 된 모든 값의 수를 추적하는 것입니다. IE에서 (DOM은 객체와 같은) 비 네이티브 자바 스크립트 객체에 액세스 할 때 문제의 원인이 알고리즘 수도 여전히 있지만, 자바 스크립트 엔진은 현재이 알고리즘을 사용하고 있지 않습니다.
    • 순환 기준 코드 현상이있을 때, "기준 계수"알고리즘은 문제를 일으킬 수있다.
    • 리프트 변수 참조뿐만 아니라 도움 순환 참조의 현상을 제거하지만, 가비지 컬렉션도 좋아합니다. 메모리의 효과적인 복구를 보장하기 위해 더 이상 사용 세계 객체 참조 전역 객체 속성 원형 기준 변수를 해제한다.

추천

출처www.cnblogs.com/forface/p/12430347.html